Java、UDP Socket编程
一、UDP Socket编程流程
(1)首先要建立数据报通信的Socket,我们可以通过创建一个DatagramSocket对象实现它。
(2)创建一个数据报文包,用来实现无连接的包传送服务。每个数据报文包用DatagramPacket类创建。
(3)创建完DatagramSocket和DatagramPacket对象,就可以发送数据报文包了。发送是通过调用DatagramSocket对象的send方法实现,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。
(4)当然,我们也可以接收数据报文包。为了接收从服务器返回的结果数据报文包,我们需要创建一个新的DatagramPacket对象,这就需要用到DatagramPacket的另一种构造方式DatagramPacket(byte bufferedarray[],int length),即只需指明存放接收的数据报的缓冲区和长度。调用DatagramSocket对象的receive()方法完成接收数据报的工作。
(5)处理接收缓冲区内的数据,获取服务结果。
(6)当通信完成后,可以使用DatagramSocket对象的close()方法关闭数据报通信Socket。(当然,Java会自动关闭Socket,释放DatagramSocket和DatagramPacket所占用的资源。但是作为一种良好的编程习惯,还是要显式地予以关闭。)
(图片来源网络,侵权联系删除!)
二、使用UDP Socket设计一个简单的基于C/S的对聊程序。
1、服务端程序
代码如下:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class server {
public static void main(String[] args) throws IOException {
DatagramSocket server=new DatagramSocket(1234);
while(true) {
//服务器先收消息
byte[] indata=new byte[1024];
DatagramPacket dpin=new DatagramPacket(indata,1024);
server.receive(dpin);
InetAddress inad=dpin.getAddress();//获取客户端IP地址
int port=dpin.getPort();//获取客户端端口
String data=new String(dpin.getData(),0,dpin.getLength());
if(data.equals("break")) {
//客户端输入break,则断开连接。
String exit="break";
byte[] outdata=exit.getBytes();
DatagramPacket dpout=new DatagramPacket(outdata,outdata.length,inad,port);
server.send(dpout);
System.out.println("服务器退出!");
break;
}
System.out.println("客户端:"+data);
System.out.println("服务器:");
Scanner s=new Scanner(System.in);//输入服务器要发送的数据
String out=s.next();
byte[] outdata=out.getBytes();
DatagramPacket dpout=new DatagramPacket(outdata,outdata.length,inad,port);//将数据封装到DatagramPacket里
server.send(dpout);
}
}
}
2、客户端程序
代码如下:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class client {
public static void main(String[] args) throws IOException {
InetAddress address =InetAddress.getByName("127.0.0.1");
DatagramSocket client=new DatagramSocket(5678,address);
while(true) {
System.out.println("客户端:");
Scanner s=new Scanner(System.in);
String out=s.next();
byte[] outdata=out.getBytes();
DatagramPacket dpout=new DatagramPacket(outdata,out.length(),address,1234);
client.send(dpout);
byte[] indata=new byte[1024];
DatagramPacket dpin=new DatagramPacket(indata,1024);
client.receive(dpin);
String data=new String(dpin.getData(),0,dpin.getLength());
if(data.equals("break")) {
String exit="break";
byte[] outdata1=exit.getBytes();
DatagramPacket dpout1=new DatagramPacket(outdata1,out.length(),address,1234);
client.send(dpout1);
System.out.println("客户端退出!");
break;
}
System.out.println("服务器:"+data);
}
}
}
三、测试结果
1、客户端
2、服务器
总结
其实用Java实现UDP Socket完成对聊程序很简单,只要流程掌握熟悉,函数什么的只要.一下就可以自己看需要哪些,测试的时候有遇到过客户端发送你好,而服务器只收到你的情况,这个其实是正常的,因为UDP 是不靠谱的连接,他不检查你的数据是否出错,所以遇到数据丢失的情况是正常的,正好证明了UDP的不靠谱性。但是由于这是本地的测试,所以出现数据丢失也是蛮离谱的。。如果是我的见解有错误,请大家指正!