基于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();
}
}
}
编译结果如下图所示:
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();
}
}
}
编译结果如下图所示:
6.文本聊天程序
运行结果如下图所示:
接收数据:
发送数据: