使用UDP实现聊天功能
来源:互联网 发布:js 数组 contains方法 编辑:程序博客网 时间:2024/05/16 17:34
package sockettest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MultiCastSender {
private static final byte TTL = 1;
private static final int DATAGRAM_BYTES = 1024;
private int mulcastPort;
private InetAddress mulcastIP;
private BufferedReader input;
private MulticastSocket mulcastSocket;
public static void main(String[] args) {
MultiCastSender cast = new MultiCastSender();
try {
cast.sender("224.1.1.1", "12345");
} catch (Exception e) {
e.printStackTrace();
}
}
public void sender(String ip, String port) throws Exception {
DatagramPacket mulcastPacket;
String nextLine;// 读取键盘输入的字符串
byte[] mulcastBuffer;// 数据包使用的字节数组
byte[] lineData;// 存放键盘输入的内容
int sendLength;
// 读取键盘信息
input = new BufferedReader(new InputStreamReader(System.in));
// 创建 MulticastSocket 多点广播对象
mulcastIP = InetAddress.getByName(ip);
mulcastPort = Integer.parseInt(port);
mulcastSocket = new MulticastSocket();
// 循环读取键盘信息,向多点广播
while ((nextLine = input.readLine()) != null) {
mulcastBuffer = new byte[DATAGRAM_BYTES];
// 如果读取的键盘信息长度大于缓冲区,将发送大小设置为数据包的字节大小
if (nextLine.length() > mulcastBuffer.length) {
sendLength = mulcastBuffer.length;
} else {
sendLength = nextLine.length();
}
// 将键盘输入的字符串转换为字节数组
lineData = nextLine.getBytes();
// 将字节数据复制到数据包中
for (int i = 0; i < sendLength; i++) {
mulcastBuffer[i] = lineData[i];
}
// 创建数据包
mulcastPacket = new DatagramPacket(mulcastBuffer, mulcastBuffer.length, mulcastIP, mulcastPort);
// 发送数据包
mulcastSocket.send(mulcastPacket, TTL);
}
mulcastSocket.close();// close the socket
}
}
//使用eclipse运行两个程序可能会有问题,直接使用cmd窗口分别运行两个class文件,可以确保成功
接收端:
package sockettest;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MultiCastReceiver {
private static final int DATAGRAM_BYTES = 1024;
private int multicastPort;
private InetAddress mulcastIP;
private MulticastSocket mulcastSocket;
private boolean keepReceiving = true;
public static void main(String[] args) {
MultiCastReceiver cast = new MultiCastReceiver();
try {
cast.receiver("224.1.1.1", "12345");
} catch (Exception e) {
System.out.println("发生错误 " + e);
e.printStackTrace();
}
}
public void receiver(String ip, String port) throws Exception {
DatagramPacket mulcastPacket;// 接收UDP数据包
byte[] mulcastBuffer;// 用于接收的字节数组
InetAddress fromIP;// 发送方的IP地址
int fromPort;// 发送方的端口号
String mulcastMsg;
// 设置接收消息的Socket
mulcastIP = InetAddress.getByName(ip);
multicastPort = Integer.parseInt(port);
mulcastSocket = new MulticastSocket(multicastPort);
// 将ip加入到socket转发组
mulcastSocket.joinGroup(mulcastIP);
while (keepReceiving) {
// 创建一个数据包
mulcastBuffer = new byte[DATAGRAM_BYTES];
mulcastPacket = new DatagramPacket(mulcastBuffer, mulcastBuffer.length);
// 接收数据包
mulcastSocket.receive(mulcastPacket);
fromIP = mulcastPacket.getAddress();
fromPort = mulcastPacket.getPort();
mulcastMsg = new String(mulcastPacket.getData());
// 打印输出接收到的消息
System.out.println("Received from " + fromIP + " on port " + fromPort + ":" + mulcastMsg);
}
// 退出
mulcastSocket.leaveGroup(mulcastIP);
mulcastSocket.close();
}
// 停止接收消息
public void stop() {
if (keepReceiving) {
keepReceiving = false;
}
}
}