欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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è)客戶(hù)端向服務(wù)器發(fā)送信息,服務(wù)端再將信息返回到各個(gè)客戶(hù)端。

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

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)類(lèi):

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() {
? ? ? ? ? ? // 多線(xiàn)程發(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ù),端口號(hào)不能重復(fù)所以設(shè)置了6001-6005,線(xiàn)上只需同一接收udp端口號(hào)即可。

public class ServerCilent {
? ? public static void main(String[] args) throws IOException {
? ? ? ? //接受數(shù)據(jù)包
? ? ? ? DatagramSocket rec = new DatagramSocket(6262);//接收端口號(hào)
? ? ? ? //建立發(fā)送類(lèi)
? ? ? ? DatagramSocket send = new DatagramSocket(); //發(fā)送數(shù)據(jù)
? ? ? ? List<String> addressList=new ArrayList<>();//存放所有發(fā)送數(shù)據(jù)用戶(hù)的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("客戶(hù)端發(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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

客戶(hù)端測(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)文章

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

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

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

    Mybatis-Spring源碼分析圖解

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

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

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

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

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

    詳解JAVA SPI機(jī)制和使用方法

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

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

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

    Java web xml文件讀取解析方式

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

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

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

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

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

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

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

最新評(píng)論