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

Java Socket實現(xiàn)簡易聊天室

 更新時間:2021年03月16日 17:18:05   作者:快樂鍵盤俠  
這篇文章主要為大家詳細介紹了Java Socket實現(xiàn)簡易聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Java-Socket編程實現(xiàn)簡易聊天室(TCP),供大家參考,具體內(nèi)容如下

實現(xiàn)一個服務(wù)器接收多個客戶端

測試:

首先啟動服務(wù)器,然后啟動三個客戶端,輸入三個不同的用戶名,分別在聊天室發(fā)消息
看其他客戶端是否能接收到消息

效果如下圖:

一號發(fā)消息

可以在二號和三號客戶端接收到消息

服務(wù)器設(shè)計

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.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server1 {

 static public List<Client> list = new ArrayList<Client>();

 static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

 public static void main(String[] args) {
  //創(chuàng)建一個ServerSocket監(jiān)聽端口
  try (ServerSocket server = new ServerSocket(5678)) {

   while (true) {     // 利用死循環(huán)不停的監(jiān)聽端口

    Socket s = server.accept();// 利用Socket服務(wù)器的accept()方法獲取客戶端Socket對象。
    addClient(s);

   }

  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 // 添加客戶端
 private static void addClient(Socket s) {
  String name;

  try {
   BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
   name = in.readLine();
   Client c = new Client(name, s);// 創(chuàng)建客戶端處理線程對象
   System.out.println(name);
   list.add(c);

   cachedThreadPool.execute(c);

  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 static class Client implements Runnable {

  String name;  // 客戶端名字
  Socket s = null; // 保存客戶端Socket對象

  BufferedReader in;
  PrintWriter out;

  Client(String name, Socket s) {

   this.s = s;
   this.name = name;

   try {
    in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    out = new PrintWriter(s.getOutputStream());
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  @Override
  public void run() {
   try {
    while (true) {
     String str = in.readLine();
     for (int j = 0; j < list.size(); j++) {
      Server1.Client c = list.get(j);
      if (c != this) {
       System.out.println(str);
       c.send(str+"-|1|2|-"+name);
      }
     }

     if (str.equals("end"))
      break;
    }

    try {
     s.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  }

  public void send(String str) throws IOException {
   out.println(str);
   out.flush();
  }
 }
}

客戶端設(shè)計

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client1 {
 public static String name = null;
 static Socket socket = null;

 static BufferedReader in;
 static PrintWriter out;

 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);

  System.out.print("輸入用戶名:>");
  name = sc.nextLine();

  try {
//   socket = new Socket("116.62.173.212", 5678);
   socket = new Socket("127.0.0.1", 5678);

   System.out.println(socket);

   System.out.println("已連接服務(wù)器>");

   out = new PrintWriter(socket.getOutputStream());
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

   Thread receive = new Thread(new receiveThread());
   receive.start();

   out.println(name);
   out.flush();

   String msg;

   while (true) {
//    System.out.print("你說:>");
    msg = sc.nextLine();

    out.println(msg);
    out.flush();

    if (msg.equalsIgnoreCase("end"))
     break;
   }

  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 static class receiveThread implements Runnable{

  @Override
  public void run() {
   try {
    while (socket!=null) {

     String str = in.readLine();
     String message = str.split("-\\|1\\|2\\|-")[0];
     String name = str.split("-\\|1\\|2\\|-")[1];
     System.out.println(name + ":>" + message);

    }
   }catch(Exception e) {
    e.printStackTrace();
   }
  }
 }
}

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

相關(guān)文章

  • 新版SpringBoot無法主動讀取bootstrap.yml的原因和解決方法

    新版SpringBoot無法主動讀取bootstrap.yml的原因和解決方法

    在使用新版 Springboot 搭建微服務(wù)時 發(fā)現(xiàn)配置數(shù)據(jù)源失敗,依賴、配置、注解等所示所有均為正確,所以本文給大家介紹了新版SpringBoot無法主動讀取bootstrap.yml的原因和解決方案,需要的朋友可以參考下
    2025-01-01
  • Java對數(shù)器的使用講解

    Java對數(shù)器的使用講解

    今天小編就為大家分享一篇關(guān)于Java對數(shù)器的使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java針對ArrayList自定義排序的2種實現(xiàn)方法

    Java針對ArrayList自定義排序的2種實現(xiàn)方法

    這篇文章主要介紹了Java針對ArrayList自定義排序的2種實現(xiàn)方法,結(jié)合實例形式總結(jié)分析了Java操作ArrayList自定義排序的原理與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Jenkins如何實現(xiàn)自動打包部署linux

    Jenkins如何實現(xiàn)自動打包部署linux

    這篇文章主要介紹了Jenkins如何實現(xiàn)自動打包部署linux,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java修改圖片大小尺寸的簡單實現(xiàn)

    Java修改圖片大小尺寸的簡單實現(xiàn)

    這篇文章主要介紹了Java修改圖片大小尺寸的簡單實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO

    本文主要介紹了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot深入分析講解監(jiān)聽器模式上

    SpringBoot深入分析講解監(jiān)聽器模式上

    監(jiān)聽器模式,大家應(yīng)該并不陌生,主要的組成要素包括了事件、監(jiān)聽器以及廣播器;當事件發(fā)生時,廣播器負責將事件傳遞給所有已知的監(jiān)聽器,而監(jiān)聽器會對自己感興趣的事件進行處理
    2022-07-07
  • Java將一個正整數(shù)分解質(zhì)因數(shù)的代碼

    Java將一個正整數(shù)分解質(zhì)因數(shù)的代碼

    這篇文章主要介紹了將一個正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5,需要的朋友可以參考下
    2017-02-02
  • Springmvc基于fastjson實現(xiàn)導包及配置文件

    Springmvc基于fastjson實現(xiàn)導包及配置文件

    這篇文章主要介紹了Springmvc基于fastjson實現(xiàn)導包及配置文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot統(tǒng)一接口返回及全局異常處理高級用法

    SpringBoot統(tǒng)一接口返回及全局異常處理高級用法

    這篇文章主要為大家介紹了SpringBoot統(tǒng)一接口返回及全局異常處理高級用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

渝中区| 漳州市| 周口市| 富川| 武邑县| 铁岭县| 岢岚县| 出国| SHOW| 久治县| 察隅县| 乐清市| 和林格尔县| 宁晋县| 同德县| 博乐市| 拜城县| 安多县| 扎鲁特旗| 桃园市| 花莲市| 湟源县| 泸水县| 信丰县| 宣化县| 桑植县| 广平县| 阳山县| 宁海县| 开远市| 武陟县| 车致| 韶山市| 荃湾区| 蕉岭县| 鞍山市| 兴文县| 繁峙县| 尉氏县| 华蓥市| 顺平县|