前两个星期一直在学网络相关的东西,说到网络就必须知道Socket套接字以及常见的TCP、UDP协议,下面先记一下之前学的Udp相关内容
首先先写个实例,就先实现Udp客户端与服务端之间的通信
要做的事情:
创建客户端
创建数据报套接字的对象<------new DatagramSocket()
创建DatagramPacket对象发送Udp包<------new DatagramPacket(byte[], int, InetAddress, int)//参数分别是要发送的数组、数组长度、ip地址对应的InetAddress对象、端口号
发送Udp包<-------调用DatagramSocket类的send(DatagramPacket)//参数是上面创建的对象
记得关闭数据报套接字<------对象直接调用close()
创建服务端
创建数据报套接字对象并绑定端口<------new DatagramSocket(int)//参数是端口号
创建DatagramPacket对象接收Udp包<------new DatagramPacket(byte[], int);//参数分别是要接收的数组,数组长度
接收Udp包<-------调用DatagramSocket类的receive(DatagramPacket);//参数是上面创建的对象
记得关闭数据报套接字<------对象直接调用close()
下面是实现基本通信的代码
客户端发送
String udpString = "Client----------->server";//要发送的字符串
DatagramSocket dSocket = null;//数据报套接字对象
try {
dSocket = new DatagramSocket();
InetAddress serAddress = InetAddress.getByName("127.0.0.1");//本地ip,使用自己的ip地址也可以的
DatagramPacket dpPacket = new DatagramPacket(udpString.getBytes(),
udpString.length(), serAddress, 8088);//8088端口号
dSocket.send(dpPacket);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(dSocket!= null){
dSocket.close();//记得关闭
}
}
服务端接收
//建立一个字节数组已接收Udp包
byte[] msg = new byte[1024];//客户端发送的数据不要超出这里的长度
DatagramPacket dpPacket = new DatagramPacket(msg, msg.length);
DatagramSocket dSocket = null;
try {
//创建数据报套接字对象,并绑定在指定端口上
dSocket = new DatagramSocket(8088);
//接收Udp包
dSocket.receive(dpPacket);
String resultFromServer = new String(
dpPacket.getData(),dpPacket.getOffset(),dpPacket.getLength());
System.out.println("接收到的信息是:" + resultFromServer);
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭套接字对象
if(dSocket != null){
dSocket.close();
}
}
结果:
//-----------------------------------------------回来修改----------------------------------------------
在上面服务端的代码中第二行,如果定义的数组长度不够长(即接收的字符串装不下)怎么办,会发生什么情况呢?
我把接收时的数组长度改成10,结果如下
说明接收不到完整的信息,这比较容易理解,因为容器就是装不下那么多了,那些装不下的就是被抛弃了
那要是我在服务端接收后面再用一个新的数组去接收能不能接收得到呢?
我在接收的后面再接收一次发现接收不到,说明接收不到的结果就是被抛弃了!
所以我们在接收完数据之后应该及时将缓冲区清空,保证下次接收正常