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

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

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

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

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

測試:

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

效果如下圖:

一號發(fā)消息

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

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

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)建一個(gè)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è)計(jì)

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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA字符串占位符使用方法實(shí)例

    JAVA字符串占位符使用方法實(shí)例

    今天同事又問起類似符串占位符使用的功能,所以下面這篇文章主要給大家介紹了關(guān)于JAVA字符串占位符使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • ibatis結(jié)合oracle批量插入三種方法的測評

    ibatis結(jié)合oracle批量插入三種方法的測評

    今天小編就為大家分享一篇關(guān)于ibatis結(jié)合oracle批量插入三種方法的測評,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java的云打印Lodop

    Java的云打印Lodop

    這篇文章主要介紹了Java的云打印Lodop 的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Java命令行下Jar包打包小結(jié)

    Java命令行下Jar包打包小結(jié)

    這篇文章主要介紹了Java命令行下Jar包打包小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java判斷絕對值的方法總結(jié)

    Java判斷絕對值的方法總結(jié)

    在本文中作者為大家分享了兩種Java判斷絕對值的方法,對此有興趣的朋友可以和小編一起學(xué)習(xí)下。
    2018-02-02
  • springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐

    springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐

    本文主要介紹了springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • JavaWeb動態(tài)導(dǎo)出Excel可彈出下載

    JavaWeb動態(tài)導(dǎo)出Excel可彈出下載

    這篇文章主要介紹了JavaWeb動態(tài)導(dǎo)出Excel,對Excel可彈出進(jìn)行下載操作,感興趣的小伙伴們可以參考一下
    2016-03-03
  • maven一鍵刪除倉庫無用文件的實(shí)現(xiàn)

    maven一鍵刪除倉庫無用文件的實(shí)現(xiàn)

    大家都知道我們在使用Maven的時(shí)候,會下載一堆無用非jar文件,本文主要介紹了maven一鍵刪除倉庫無用文件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 關(guān)于Lombok簡化編碼使用及說明

    關(guān)于Lombok簡化編碼使用及說明

    這篇文章主要介紹了關(guān)于Lombok簡化編碼使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java垃圾收集器與內(nèi)存分配策略詳解

    java垃圾收集器與內(nèi)存分配策略詳解

    本篇文章主要介紹了Java垃圾收集器與內(nèi)存分配策略的方法和原理總結(jié),Java垃圾回收器是Java虛擬機(jī)的重要模塊,具有一定的參考價(jià)值,有興趣的可以了解一下
    2021-08-08

最新評論