【Java、UDP Socket】JavaUDP Socket编程实现基于C/S的对聊程序


一、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的不靠谱性。但是由于这是本地的测试,所以出现数据丢失也是蛮离谱的。。如果是我的见解有错误,请大家指正!

猜你喜欢

转载自blog.csdn.net/qq_51720181/article/details/125553215