基于UDP协议的文本聊天程序


1.要求

使用JAVA完成一个基于TCP协议的文本聊天程序,建立TCP客户端套接字,分别为服务端和客户端,并使两端可以互联。

2.UDP协议

在UDP协议中,没有TCP中所谓的服务器端和客户端,而是有数据的发送端和接收端。也就是说UDP发送数据就好像发电报一般,对于一段需要发送的数据,每次都生成一个“数据包”实例,然后发出去。

3.语法

与UDP相关的类,除了在本人其他博客中(基于TCP协议的文本聊天程序)所介绍过的inetAddress之外,还有DatagramSocket和DatagramPacket,下面将分别介绍这两类:

  • DatagramPacket类
    DatagramPacket类是“数据包”类,它不但用于发送数据,还用于接收数据。
    在发送数据的时候,需要使用以下几个方法。
    1)setAddress(InetAddress);设置数据的接收端IP地址。
    2)setPort(int):设置数据接收端端口。
    3)setData(byte[]data,int offset,int length):设置要发送的数据。其中data是一个byte数组,offset是指要发送的数据从offset那个索引开始,length是数据长度,也就是说,实际发送的数据是是data数组中索引为offset至索引为offset——length-1的这段内容。
    在接收数据的时候,需要使用以下几个方法:
    1)构造方法DatagramPacket(byte[] data,int length):创建一个用于发送数据的DatagramPacket对象,其中data数组用来放置将来接收到的数据的,length则代表最大可以使用的数组长度(data数组可能不能够全部用来放置本次接受到的数据)。
    2)Byte[]getData():得到接收到的数据。
    3)Int getLength:得到数据的长度。
    4)Int getPort:得到数据发送端的端口。
    5)InetAddress getAddress():得到数据发送端的IP地址。

  • DatagramSocket类
    DatagramSocket类是具体负责发送和接收数据的。其中最主要的方法有:
    1)构造方法DatagramSocket(int port):创建一个DatagramSocket实例,并让它在port端口监听。如果要使用一个DatagramSocket实例收数据,则最好使用这个构造方法。这样发送数据的程序就可以向确定的端口发送数据了。
    2)构造方法DatagramSocket():创建一个DatagramSocket实例,并且让它在系统自动分配的端口监听。如果使用DatagramSocket实例发送数据,则可以使用这个构造方法。
    3)send(DatagramPacket):发送数据包。
    4)receive(DatagramPacket):接受数据包。

4.接收端

代码:

import java.io.IOException;							// 引入需要使用的类
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class rw26 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// 构造用于接收数据的DatagramPacket对象
			System.out.println("构建DatagramPacket对象……");
			byte[] data = new byte[1024];
			DatagramPacket dp = new DatagramPacket(data, data.length);
			System.out.println("使用DatagramPacket对象接收数据……");
			// 在7777端口监听,等待接收数据。
			DatagramSocket ds = new DatagramSocket(7777);
			ds.receive(dp);							// 等待数据到来
			System.out.println("数据接收完毕。");
			byte[] recData = dp.getData();			// 分析数据,输出到控制台
			int len = dp.getLength();
			String content = new String(recData, 0, len);
			System.out.println("接收到的数据为:" + content);
			ds.close();								// 关闭,释放资源
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

编译结果如下图所示:
JAVA——基于UDP协议的文本聊天程序-LMLPHP

5.发送端

代码:

import java.io.IOException;								// 引入需要使用的类
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class rw27 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// 构建一个用于发送数据的DatagramPacket对象,包括数据、目的IP地址和			// 目的端口
			System.out.println("构建DatagramPacket对象……");
			String content = "使用UDP传输数据。";
			byte[] data = content.getBytes();
			DatagramPacket dp = new DatagramPacket(data, data.length);
			byte[] addr = new byte[] { 127, 0, 0, 1 };
			InetAddress local = InetAddress.getByAddress(addr);
			dp.setAddress(local);						// 向本机发送
			dp.setPort(7777);							// 向7777端口发送
			System.out.println("发送DatagramPacket对象……");
			DatagramSocket ds = new DatagramSocket();
			ds.send(dp);								// 发送数据
			System.out.println("发送结束。");
			ds.close();									// 关闭,释放资源
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

编译结果如下图所示:
JAVA——基于UDP协议的文本聊天程序-LMLPHP

6.文本聊天程序

运行结果如下图所示:
接收数据:
JAVA——基于UDP协议的文本聊天程序-LMLPHP
发送数据:
JAVA——基于UDP协议的文本聊天程序-LMLPHP

10-04 20:58