本学期计算机网络课程要求完成一个TCP和一个UDP的通信程序,我完成了功能的简单实现。我在上一篇博客已经讲了TCP的具体实现,接下来讲一讲UDP程序的实现。
目录
效果展示
以下是具体实现过程:
一、项目结构
UDPClient:UDP客户端的核心代码部分;
UDPServer:UDP服务器端的核心代码部分;
UDPFrame:UDP客户端和服务器端的界面搭建;
UDPSend:UDP客户端或服务器端的一端向另一端发送消息;
UDPReceive:UDP客户端或服务器端的一端接收另一端发送的消息;
ReminderTextAdapter:网上查阅的代码,非核心内容实现部分,主要用于灰色提示字hint功能的实现(swing中的实现方法不太熟悉);
注:在UDP通信中,没有TCP那样明确的ServerSocket,只是通过Datagram数据报的方式传递给另外的DatagramSocket,因此本项目中虽然有客户端与服务器端的区别,但本质上二者并无区别(即客户端与服务器端实现方式基本相同),因此客户端和服务器端需要的界面布局也相同,故我也把二者的界面抽取成了一个类,在此特地说明一下。
二、完整代码
1.UDPClient
代码如下:
package udpCommunication;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPClient implements ActionListener, Runnable {
private DatagramSocket datagramSocket;
private Thread thread = null;
private UDPFrame clientFrame;
public UDPClient() {
JPanel panel = new JPanel();
clientFrame = new UDPFrame("UDPClient");
clientFrame.add(panel);
clientFrame.placeComponents(panel);
clientFrame.setVisible(true);
clientFrame.getConnect().addActionListener(e -> {
try {
//host:"127.0.0.1"
//String host = UDPClientFrame.getIpField().getText();
//port:8887
int dSocketPort = Integer.parseInt(clientFrame.getDSocketField().getText());
datagramSocket = new DatagramSocket(dSocketPort);
clientFrame.getTextArea().append("[连接] : 正在连接中……\n");
clientFrame.getTextArea().append("\t连接成功\n");
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
} catch (IOException ex) {
ex.printStackTrace();
}
});
clientFrame.getTransmit().addActionListener(this);
clientFrame.getTextArea().append("……UDP客户端启动……\n");
System.out.println("……UDP客户端启动……\n");
}
public static void main(String[] args) {
new UDPClient();
}
//向服务器端发送数据
@Override
public void actionPerformed(ActionEvent e) {
//String send = UDPClientFrame.getSendField().getText();
//port:8888
//发送消息
new UDPSend(datagramSocket, clientFrame, "客户端").sendMessages();
}
//使用线程处理客户端接收服务器端的数据
@Override
public void run() {
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
new UDPReceive(datagramSocket, datagramPacket, clientFrame, "服务器端").receiveMessages();
}
}
2.UDPServer
代码如下:
package udpCommunication;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java