使用UDP实现聊天功能

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;

}

}

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值