开发一个基于UDP协议的网络聊天室。(项目目录结构截图贴到答案框。测试时要求启动两个客户端,每个客户端至少发一次言
目录:
client.java
package UDP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
//基于UDP协议的网络通信客户端,循环实现先发送一个数据报到服务器,再接收一个数据报
public class client {
public client() {
DatagramSocket socket = null;
String sendStr;
try {
// 创建一个DatagramSocket,使用系统提供的端口
socket = new DatagramSocket();
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("对话开始,请输入对话内容!");
// 通过键盘输入字符串
while ((sendStr = stdIn.readLine()) != null) {
// 把键盘输入的字符串转成字节数组
byte[] buf = sendStr.getBytes();
// 把表示服务器端IP地址的字符串转换成InetAddress对象
InetAddress address = InetAddress.getByName("127.0.0.1");
// 使用要发送的字节数组,目标IP地址和端口号,构造数据报
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
// 使用DatagramSocket对象发送数据报
socket.send(packet);
byte[] buf1 = new byte[256];
// 使用空字节数组构造空数据报
packet = new DatagramPacket(buf1, buf1.length);
// 使用DatagramSocket对象接收数据到空数据报中
socket.receive(packet);
// 根据数据报的数据和长度构造字符串
String received = new String(packet.getData(), 0, packet.getLength());
// 显示接收到的字符串和远端的IP地址和端口号,trim方法表示删除字符串前后的空格
System.out.println("接收到的信息: " + received.trim() + " 来自" + packet.getAddress().getHostAddress() + ":"
+ packet.getPort());
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null)
socket.close();
}
}
public static void main(String[] args) {
new client();
}
}
server.java
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
//基于UDP通信的服务器端,服务器端接收发送数据的原理与客户端一样
//循环实现先接收一个数据报,再发送回去一个数据报
public class server {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
System.out.println("服务器端启动成功!");
//创建一个DatagramSocket对象,绑定端口4445
socket = new DatagramSocket(4445);
System.out.println("绑定的端口号为:"+socket.getLocalPort());
while (true) {
byte[] buf = new byte[256];
// 创建用于接收数据的空数据报
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);//用套接字接收数据包
//获取发送数据报的客户端的地址
InetAddress clientAddress = packet.getAddress();
//获取发送数据报的客户端的端口号
int clientPort = packet.getPort();
System.out.println(
new String(packet.getData()).trim() + " 来自:" + clientAddress.getHostAddress() + ":" + clientPort);
// 创建要发送的数据报(包含发送的数据,客户端地址和端口号),发送回客户端
packet = new DatagramPacket(buf, buf.length, clientAddress, clientPort);
socket.send(packet);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(socket!=null)socket.close();
}
}
}