首页 > 学院 > 开发设计 > 正文

Socket通信学习实例四之UDP通信

2019-11-06 09:41:10
字体:
来源:转载
供稿:网友

本篇文章介绍下基于UDP协议的Socket通信

这里写图片描述

这里写图片描述

对于Socket还不太了解的建议先看看我前面三篇文章 Socket网络知识学习基础 Socket通信学习实例一之建立Socket连接 Socket通信学习实例二之即时通信 Socket通信学习实例三之断点上传

java中的UDP网络通信用到的类

DatagramSocket DatagramSocket有如下构造方法:

DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。 DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。 DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据. 如果在创建DatagramSocket对象时,没有指定网卡的ip 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.

发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.

发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.

DatagramPacket DatagramPacket类有如下构造方法:

DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为length的数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。

接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.

InetAddress Java中对IP地址进行包装的类, DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.

基本实现流程

服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。 客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName(”172.168.1.120”)).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。*(Stringstr=”hello”;bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

代码分析

服务端代码

public SocketUDPTest() throws IOException { /* * 接收客户端发送的数据 */ //创建一个DatagramSocket对象,并指定监听端口 DatagramSocket socket = new DatagramSocket(SocketTool.PORT); //创建一个byte类型的数组,用于存放接收到得数据 byte[] data = new byte[1024]; //创建数据报,用于接收客户端发送的数据 DatagramPacket packet = new DatagramPacket(data, data.length); System.out.PRintln("1.服务端 " + SocketTool.getIP() + " 已经启动,等待客户端发送数据"); //接收客户端发送的数据,此方法在接收到数据报之前会一直阻塞 socket.receive(packet); //读取客户端发送的数据 //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长 String result = new String(data, 0, packet.getLength()); System.out.println("2.服务端收到客户端发送的消息:" + result); /* * 向客户端响应数据 */ //从数据报中获取客户端的地址、端口号 InetAddress address = packet.getAddress(); int port = packet.getPort(); //创建要包含到数据报中的信息 byte[] data2 = "Hello World!".getBytes(); //创建数据报,包含响应的数据信息 DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port); //响应客户端 socket.send(packet2); //关闭Socket socket.close(); }

客户端代码

private void sendUDPSocket() throws IOException { /* * 向服务器端发送数据 */ //定义服务器的地址、端口号 InetAddress address = InetAddress.getByName(SocketTool.HOST); int port = SocketTool.PORT; //创建要包含到数据报中的信息 byte[] sendData = "Hello Socket From UDP!".getBytes(); //创建数据报,包含要发送的数据信息 DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port); //创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); //向服务器端发送数据报 socket.send(sendPacket); /* * 接收服务器端响应的数据 */ //创建一个byte类型的数组,用于存放接收到得数据 byte[] receiveData = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); //接收服务端响应的数据,此方法在接收到数据报之前会一直阻塞 socket.receive(receivePacket); //读取服务端响应的数据 String result = new String(receiveData, 0, receivePacket.getLength()); Log.i(TAG, "3.客户端收到服务端响应的消息:" + result); //关闭Socket socket.close(); }

由于比较简单,直接看注释就可以,界面部分参考demo,这里不详细分析了

完整示例: Android端代码 JAVA端代码


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表