使用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;

}

}

}


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我是一个粉刷匠简谱 我是一个粉刷匠钢琴谱 粉刷匠隐藏恐怖含义 粉刷匠为什么恐怖 粉刷匠钢琴简谱 粉刷匠简谱图片 我是一个粉刷匠儿歌 粉刷石膏和腻子有啥区别 粉刷墙面多少钱一平 粉刷匠吉他谱 粉刷匠简谱左右手 我是一个粉刷匠简谱歌谱 墙面粉刷收费 粉刷墙面多少钱一平方 腻子粉刷墙步骤 墙面粉刷步骤 外墙粉刷步骤 内墙粉刷多少钱一平米 专业粉刷墙面 墙面重新粉刷 房屋粉刷面积怎么算 室内墙面粉刷价格 墙壁粉刷价格 粉刷墙面多少钱 重新粉刷墙面 墙面粉刷多少钱 内墙粉刷报价 厂房墙面粉刷 外墙粉刷价格 家庭墙面粉刷多少钱 梦见粉刷房子 外墙粉刷多少钱 专业墙面粉刷 怎么粉刷墙壁 百子湾墙面粉刷 粉刷墙壁要多少钱 亦庄粉刷墙面 怎样粉刷墙壁 房屋墙面粉刷 外墙粉刷图片 厂房外墙粉刷