亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

這是接收udp的實現(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的實現(xiàn)類:

public class Send implements Runnable {
? ? ? ? private DatagramSocket ds;//負責(zé)發(fā)送和接受數(shù)據(jù)
? ? ? ? private int receport;//準(zhǔn)備發(fā)送的端口號
? ? ? ? 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ù)包有四個部分組成
? ? ? ? ? ? ? ? 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ù)端:

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

public class ServerCilent {
? ? public static void main(String[] args) throws IOException {
? ? ? ? //接受數(shù)據(jù)包
? ? ? ? DatagramSocket rec = new DatagramSocket(6262);//接收端口號
? ? ? ? //建立發(fā)送類
? ? ? ? DatagramSocket send = new DatagramSocket(); //發(fā)送數(shù)據(jù)
? ? ? ? List<String> addressList=new ArrayList<>();//存放所有發(fā)送數(shù)據(jù)用戶的ip
? ? ? ? while (true) {
? ? ? ? ? ? //定義一個數(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)容的長度
? ? ? ? ? ? String info = new String(dp.getData(), 0, dp.getLength());
? ? ? ? ? ? System.out.println("客戶端發(fā)送來的信息:" + 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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

客戶端測試:

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

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

相關(guān)文章

  • 2022版IDEA創(chuàng)建一個maven項目的超詳細圖文教程

    2022版IDEA創(chuàng)建一個maven項目的超詳細圖文教程

    IDEA是用于java語言開發(fā)的集成環(huán)境,并且經(jīng)常用于maven、spring、MyBatis等項目的開發(fā),下面這篇文章主要給大家介紹了關(guān)于2022版IDEA創(chuàng)建一個maven項目的超詳細圖文教程,需要的朋友可以參考下
    2023-02-02
  • Mybatis-Spring源碼分析圖解

    Mybatis-Spring源碼分析圖解

    這篇文章主要介紹了Mybatis-Spring源碼分析,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • 淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    這篇文章主要介紹了StringEntity 和 UrlEncodedFormEntity之間的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java編程調(diào)用微信分享功能示例

    Java編程調(diào)用微信分享功能示例

    這篇文章主要介紹了Java編程調(diào)用微信分享功能,結(jié)合實例形式分析了java微信分享功能接口的定義與調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 詳解JAVA SPI機制和使用方法

    詳解JAVA SPI機制和使用方法

    這篇文章主要介紹了JAVA SPI機制的相關(guān)知識以及使用示例,文中代碼非常詳細,幫助大家更好的學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容

    如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容

    這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java web xml文件讀取解析方式

    Java web xml文件讀取解析方式

    這篇文章主要介紹了Java web xml文件讀取解析方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringMVC攔截器零基礎(chǔ)掌握

    SpringMVC攔截器零基礎(chǔ)掌握

    攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2023-03-03
  • 實例講解Java批量插入、更新數(shù)據(jù)

    實例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個Java批量添加數(shù)據(jù),多個字段同時添加多條數(shù)據(jù)具體實例,面向的是Oracle數(shù)據(jù)庫,需要的朋友可以參考下
    2015-07-07
  • 在日志中記錄Java異常信息的正確姿勢分享

    在日志中記錄Java異常信息的正確姿勢分享

    這篇文章主要介紹了在日志中記錄Java異常信息的正確姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論