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

java編程實(shí)現(xiàn)多人聊天室功能

 更新時(shí)間:2022年09月15日 16:41:06   作者:奕起學(xué)習(xí)  
這篇文章主要為大家詳細(xì)介紹了java編程實(shí)現(xiàn)多人聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下

程序源代碼及運(yùn)行截圖:

server.java

//server.java
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class server implements Runnable {// 服務(wù)端
  static List<Socket> socketList=new ArrayList<Socket>();
// 讀取 In
  static Socket socket = null;
  static ServerSocket serverSocket = null;
  public server() {// 構(gòu)造方法
    try {
      serverSocket = new ServerSocket(9999);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("************服務(wù)端*************");
    server t = new server();
    int count = 0;
    while (true) {     
      try {
//       System.out.println("端口9999等待被連接......");
        socket = serverSocket.accept();
        count++;
        System.out.println("第" + count + "個(gè)客戶已連接");
        socketList.add(socket);
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      Print p = new Print(socket);
      Thread read = new Thread(t);
      Thread print = new Thread(p);
      read.start();
      print.start();
    }
  }
  @Override
  public void run() {
    // 重寫(xiě)run方法
    try {
      Thread.sleep(1000);
      BufferedReader in = new BufferedReader(new InputStreamReader(socket
          .getInputStream()));
      while (true) {
        String jieshou = in.readLine();
        System.out.println( jieshou);
        for (int i = 0; i < socketList.size(); i++) {
          Socket socket=socketList.get(i);
          PrintWriter out = new PrintWriter(socket.getOutputStream());
          if (socket!=this.socket) {
            out.println(jieshou);
          }else{
            out.println("(你)"+jieshou);
          }
          out.flush();
        }
      }
    } catch (Exception e) {

      e.printStackTrace();
    }
  }
}
class Print implements Runnable {
  static List<Socket> socketList=new ArrayList<Socket>();
  Scanner input = new Scanner(System.in);
  public Print(Socket s) {// 構(gòu)造方法
    try {
      socketList.add(s);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @Override
  public void run() {
    try {
      Thread.sleep(1000);
      while (true) {
        String msg = input.next();
      for (int i = 0; i < socketList.size(); i++) {
        Socket socket=socketList.get(i);
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        // System.out.println("對(duì)客戶端說(shuō):");
        out.println("服務(wù)端說(shuō):"+msg);
        out.flush();
      }
      }
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
}

client.java

//client.java
package Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class client implements Runnable {// 客戶端
  static Socket socket = null;
  Scanner input = new Scanner(System.in);
  static String name=null;
  public static void main(String[] args) {
    int x=(int)(Math.random()*100);
    client.name="client"+x;
    System.out.println("************客戶端"+x+"*************");
    try {
      socket = new Socket("127.0.0.1", 9999);
      System.out.println("已經(jīng)連上服務(wù)器了");
    } catch (Exception e) {
      e.printStackTrace();
    }
    client t = new client();
    Read r = new Read(socket);
    Thread print = new Thread(t);
    Thread read = new Thread(r);
    print.start();
    read.start();
  }
  @Override
  public void run() {
    try {
      Thread.sleep(1000);     
      PrintWriter out = new PrintWriter(socket.getOutputStream());
      while (true) {
        String msg = input.next();
        out.println(name+"說(shuō):"+msg);
        out.flush();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
class Read implements Runnable {
  static Socket socket = null;
  public Read(Socket socket) {
    this.socket = socket;
  }
  @Override
  public void run() {
    try {
      Thread.sleep(1000);
      BufferedReader in = new BufferedReader(new InputStreamReader(socket
          .getInputStream()));
      while (true) {
        System.out.println( in.readLine());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

測(cè)試數(shù)據(jù)一:

服務(wù)端程序運(yùn)行截圖:

客戶端1程序運(yùn)行截圖:

客戶端2程序運(yùn)行截圖:

由測(cè)試數(shù)據(jù)一可以看出:程序可以實(shí)現(xiàn)多人聊天,并且效果和性能還算可以。而且每個(gè)客戶端連接進(jìn)服務(wù)器時(shí),都會(huì)隨機(jī)產(chǎn)生一個(gè)隨機(jī)數(shù)作為自身的標(biāo)志,避免通話過(guò)程中,分辨不清彼此,而導(dǎo)致交流效果不好。

測(cè)試數(shù)據(jù)二:

服務(wù)端運(yùn)行截圖:

客戶端1程序運(yùn)行截圖:

客戶端2程序運(yùn)行截圖:

客戶端3程序運(yùn)行截圖:

客戶端4程序運(yùn)行截圖:

客戶端5程序運(yùn)行截圖:

客戶端6程序運(yùn)行截圖:

客戶端7程序運(yùn)行截圖:

 客戶端8程序運(yùn)行截圖:

客戶端9程序運(yùn)行截圖:

客戶端10程序運(yùn)行截圖:

測(cè)試二一共連入了10個(gè)客戶端進(jìn)行程序穩(wěn)定性的測(cè)試,程序運(yùn)行結(jié)果穩(wěn)定,符合實(shí)驗(yàn)預(yù)期結(jié)果,充分說(shuō)明了程序的魯棒性較強(qiáng)。

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

相關(guān)文章

  • mybatis-plus的sql加載順序源碼解析

    mybatis-plus的sql加載順序源碼解析

    這篇文章主要為大家介紹了mybatis-plus的sql加載順序源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Spring@Value使用獲取配置信息為null的操作

    Spring@Value使用獲取配置信息為null的操作

    這篇文章主要介紹了Spring@Value使用獲取配置信息為null的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中注解的常見(jiàn)用法總結(jié)

    Java中注解的常見(jiàn)用法總結(jié)

    注解(Annotation),也叫元數(shù)據(jù),是JDK1.5及以后版本引入的一個(gè)特性,本文主要為大家介紹了注解的常見(jiàn)用法,需要的小伙伴可以參考一下
    2023-07-07
  • 如何修改HttpServletRequest中header中的信息

    如何修改HttpServletRequest中header中的信息

    這篇文章主要介紹了如何修改HttpServletRequest中header中的信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java并發(fā)之AtomicInteger源碼分析

    java并發(fā)之AtomicInteger源碼分析

    AtomicInteger是java并發(fā)包下面提供的原子類,主要操作的是int類型的整型,通過(guò)調(diào)用底層Unsafe的CAS等方法實(shí)現(xiàn)原子操作。下面小編和大家一起學(xué)習(xí)一下
    2019-05-05
  • IDEA設(shè)置JVM可分配內(nèi)存大小和其他參數(shù)的教程

    IDEA設(shè)置JVM可分配內(nèi)存大小和其他參數(shù)的教程

    這篇文章主要介紹了IDEA設(shè)置JVM可分配內(nèi)存大小和其他參數(shù)的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 淺談Java中return和finally的問(wèn)題

    淺談Java中return和finally的問(wèn)題

    在Java中當(dāng)try、finally語(yǔ)句中包含return語(yǔ)句時(shí),執(zhí)行情況到底是怎樣的,finally中的代碼是否執(zhí)行,大家眾說(shuō)紛紜,有的說(shuō)會(huì)執(zhí)行,有的說(shuō)不會(huì)執(zhí)行,到底哪種說(shuō)法正確,下面我們來(lái)詳細(xì)討論下
    2015-10-10
  • Java?精煉解讀遞歸的概念與使用

    Java?精煉解讀遞歸的概念與使用

    一說(shuō)起遞歸,我想每個(gè)人都不陌生。舉個(gè)從小就聽(tīng)過(guò)的例子:從前有座山,山里有座廟,廟里有個(gè)和尚,和尚在講故事,從前有座山,山里有座廟,廟里有個(gè)和尚,和尚在講故事,從前有座山,要理解遞歸,就得先了解什么是遞歸,實(shí)際上這句話就是一個(gè)遞歸
    2022-03-03
  • SpringBoot實(shí)現(xiàn)AOP切面的三種方式

    SpringBoot實(shí)現(xiàn)AOP切面的三種方式

    Spring,SpringBoot框架憑借多種高效機(jī)制,顯著增強(qiáng)了代碼的功能性,并實(shí)現(xiàn)了切面編程(AOP)的精髓,其核心亮點(diǎn)之一,是運(yùn)用動(dòng)態(tài)代理技術(shù),無(wú)需觸動(dòng)源代碼即可在Bean的運(yùn)行時(shí)為其動(dòng)態(tài)織入額外功能,本文給大家介紹了SpringBoot通過(guò)3種方式實(shí)現(xiàn)AOP切面,需要的朋友可以參考下
    2024-08-08
  • mybatis-plus常用注解@TableId和@TableField的用法

    mybatis-plus常用注解@TableId和@TableField的用法

    本文主要介紹了mybatis-plus常用注解@TableId和@TableField的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

广汉市| 宝兴县| 肥城市| 河间市| 新宾| 平昌县| 吉隆县| 浦江县| 武陟县| 英超| 临安市| 壤塘县| 金川县| 钦州市| 昌江| 文安县| 达日县| 正蓝旗| 光泽县| 平果县| 石泉县| 鄂尔多斯市| 疏附县| 偏关县| 和龙市| 台安县| 屯门区| 阿克苏市| 利津县| 万载县| 内丘县| 武邑县| 大埔县| 崇左市| 株洲县| 衡阳县| 定兴县| 崇阳县| 枝江市| 科技| 衡南县|