java使用udp实现简单多人聊天功能

网友投稿 269 2022-08-29


java使用udp实现简单多人聊天功能

本文实例为大家分享了udp实现简单的多人聊天功能,供大家参考,具体内容如下

多个客户端向服务器发送信息,服务端再将信息返回到各个客户端。

这是接收udp的实现类:

public class Rec implements Runnable{

private DatagramSocket ds;

public Rec(DatagramSocket ds){

this.ds = ds;

}

@Override

public void run() {

while(true){

//接受数据和打印数据

byte[] buf= new byte[1024];

DatagramPacket pac = null;

try {

pac = new DatagramPacket(buf,buf.length);

ds.receive(pac);//接收数据

} catch (IOException e) {

e.printStackTrace();

}

//获得消息

String info = new String(pac.getData(),0,pac.getLength());

//获得ip地址

String ip = pac.getAddress().getHostAddress();

String port = pac.getPort()+"";

String name = info.substring(0, info.lastIndexOf(":"));

if(!name.equals(Thread.currentThread().getName())){

System.out.println(info);

}

}

}

}

这是发送udp的实现类:

public class Send implements Runnable {

private DatagramSocket ds;//负责发送和接受数据

private int receport;//准备发送的端口号

private String ipAddress; //准备发送的ip地址

public Send(DatagramSocket ds,int receport,String ipAddress){

this.ds = ds;

this.ipAddress = ipAddress;

this.receport = receport;

}

@Override

public void run() {

// 多线程发送消息

Scanner sc = new Scanner(System.in);

InetAddress ip = null;

try {

// String ipad = ipAddress.substring(0, ipAddress.lastIndexOf(":"));//ip地址

ip = InetAddress.getByName(ipAddress);

} catch (UnknownHostException e) {

e.printStackTrace();

}

while(true){

String info = sc.nextLine();

info=Thread.currentThread().getName()+":"+info;

byte[] bs = info.getBytes();

//把数据封装为数据包

//数据包有四个部分组成

Dahttp://tagramPacket pack = new DatagramPacket(bs,bs.length,ip,receport);

try {

ds.send(pack);

String content=info.substring(info.lastIndexOf(":")+1);

if(content.equals("886")){

System.out.println("已退出聊天室");

break;

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}mNYKOfVAc

服务端:

我是模拟的本地多用户,端口号不能重复所以设置了6001-6005,线上只需同一接收udp端口号即可。

public class ServerCilent {

public static void main(String[] args) throws IOException {

//接受数据包

DatagramSocket rec = new DatagramSocket(6262);//接收端口号

//建立发送类

DatagramSocket send = new DatagramSocket(); //发送数据

List addressList=new ArrayList<>();//存放所有发送数据用户的ip

while (true) {

//定义一个数据包接受数据

byte[] bs = new byte[1024];

DatagramPacket dp = new DatagramPacket(bs, bs.length);

//接受数据

rec.receive(dp);

InetAddress address = dp.getAddress();

String s = address.toString();

String ip = s.substring(s.lastIndexOf("/") + 1);//ip

//判断ip是否已存在List中

int index=1;

for (String s1 : addressList) {

if(s1.equals(ip)){

index=-1;

}

}

if(index>0){

addressList.add(ip);

}

//取出数据

//dp.getData()获取发送数据的字节数组,dp.getLength()获取发送内容的长度

String info = new String(dp.getData(), 0, dp.getLength());

System.out.println("客户端发送来的信息:" + info);

//--------------------服务器转发--------------------------//

String content=info.substring(info.lastIndexOf(":")+1);

if (content.equals("886")) {

String name=info.substring(0,info.lastIndexOf(":"));

info=name+":退出了聊天室";

}

//建立数据包 并转发信息

byte[] bs1 = info.getBytes();

for (String s1 : addressList) {

for (int i=6001;i<=6005;i++){

DatagramPacket dp1 = new DatagramPacket(bs1, bs1.length, InetAddress.getByName(s1), i);

send.send(dp1);

}

}

}

}

}

客户端测试:

public class Test1 {

public static void main(String[] args) throws SocketException {

Send s=new Send(new DatagramSocket(),6262,"127.0.0.1");

Rec rec=new Rec(new DatagramSocket(6001));

new Thread(s,"宸").start();

new Thread(rec,"宸").start();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python运算符---day04(Python运算符中用来计算集合并集的是)
下一篇:linux下python3环境安装(源码编译的方式安装)(linux安装python3.9的步骤)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~