最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能

 更新時(shí)間:2022年02月11日 09:56:59   作者:源氏不可擋  
這篇文章主要為大家詳細(xì)介紹了java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了udp實(shí)現(xiàn)簡(jiǎn)單的多人聊天功能,供大家參考,具體內(nèi)容如下

多個(gè)客戶端向服務(wù)器發(fā)送信息,服務(wù)端再將信息返回到各個(gè)客戶端。

這是接收udp的實(shí)現(xiàn)類:

public class Rec implements Runnable{
? ? private DatagramSocket ds;
? ? public Rec(DatagramSocket ds){
? ? ? ? this.ds = ds;
? ? }
? ? @Override
? ? public void run() {
? ? ? ? while(true){
? ? ? ? ? ? //接受數(shù)據(jù)和打印數(shù)據(jù)
? ? ? ? ? ? byte[] buf= new byte[1024];
? ? ? ? ? ? DatagramPacket pac = null;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? pac = new DatagramPacket(buf,buf.length);
? ? ? ? ? ? ? ? ds.receive(pac);//接收數(shù)據(jù)
? ? ? ? ? ? } 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);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

這是發(fā)送udp的實(shí)現(xiàn)類:

public class Send implements Runnable {
? ? ? ? private DatagramSocket ds;//負(fù)責(zé)發(fā)送和接受數(shù)據(jù)
? ? ? ? private int receport;//準(zhǔn)備發(fā)送的端口號(hào)
? ? ? ? private String ipAddress; //準(zhǔn)備發(fā)送的ip地址
? ? ? ? public Send(DatagramSocket ds,int receport,String ipAddress){
? ? ? ? ? ? this.ds = ds;
? ? ? ? ? ? this.ipAddress = ipAddress;
? ? ? ? ? ? this.receport = receport;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? // 多線程發(fā)送消息
? ? ? ? ? ? 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();
? ? ? ? ? ? ? ? //把數(shù)據(jù)封裝為數(shù)據(jù)包
? ? ? ? ? ? ? ? //數(shù)據(jù)包有四個(gè)部分組成
? ? ? ? ? ? ? ? DatagramPacket 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();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }

服務(wù)端:

我是模擬的本地多用戶,端口號(hào)不能重復(fù)所以設(shè)置了6001-6005,線上只需同一接收udp端口號(hào)即可。

public class ServerCilent {
? ? public static void main(String[] args) throws IOException {
? ? ? ? //接受數(shù)據(jù)包
? ? ? ? DatagramSocket rec = new DatagramSocket(6262);//接收端口號(hào)
? ? ? ? //建立發(fā)送類
? ? ? ? DatagramSocket send = new DatagramSocket(); //發(fā)送數(shù)據(jù)
? ? ? ? List<String> addressList=new ArrayList<>();//存放所有發(fā)送數(shù)據(jù)用戶的ip
? ? ? ? while (true) {
? ? ? ? ? ? //定義一個(gè)數(shù)據(jù)包接受數(shù)據(jù)
? ? ? ? ? ? byte[] bs = new byte[1024];
? ? ? ? ? ? DatagramPacket dp = new DatagramPacket(bs, bs.length);
? ? ? ? ? ? //接受數(shù)據(jù)
? ? ? ? ? ? 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);
? ? ? ? ? ? }
? ? ? ? ? ? //取出數(shù)據(jù)
? ? ? ? ? ? //dp.getData()獲取發(fā)送數(shù)據(jù)的字節(jié)數(shù)組,dp.getLength()獲取發(fā)送內(nèi)容的長(zhǎng)度
? ? ? ? ? ? String info = new String(dp.getData(), 0, dp.getLength());
? ? ? ? ? ? System.out.println("客戶端發(fā)送來(lái)的信息:" + info);
? ? ? ? ? ? //--------------------服務(wù)器轉(zhuǎn)發(fā)--------------------------//
? ? ? ? ? ? String content=info.substring(info.lastIndexOf(":")+1);
? ? ? ? ? ? if (content.equals("886")) {
? ? ? ? ? ? ? ? String name=info.substring(0,info.lastIndexOf(":"));
? ? ? ? ? ? ? ? info=name+":退出了聊天室";
? ? ? ? ? ? }
? ? ? ? ? ? //建立數(shù)據(jù)包 并轉(zhuǎn)發(fā)信息
? ? ? ? ? ? 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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

客戶端測(cè)試:

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();
? ? }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

哈密市| 瑞昌市| 正安县| 黄大仙区| 本溪| 平武县| 宜春市| 天镇县| 达州市| 久治县| 沂水县| 美姑县| 沁水县| 长寿区| 股票| 濉溪县| 大丰市| 兴业县| 吉木萨尔县| 莒南县| 仁怀市| 佛教| 柳河县| 贵定县| 柘城县| 吐鲁番市| 米脂县| 金阳县| 安丘市| 洪泽县| 贺兰县| 连江县| 山西省| 滨州市| 阳朔县| 苍梧县| 体育| 海盐县| 邹平县| 定兴县| 郴州市|