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

java實(shí)現(xiàn)多客戶聊天功能

 更新時(shí)間:2021年08月27日 12:24:51   作者:最好的碩碩  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多客戶聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

java 實(shí)現(xiàn)多客戶端聊天(TCP),供大家參考,具體內(nèi)容如下

1. 編程思想:

1)、要想實(shí)現(xiàn)多客戶端聊天,首先需要有多個(gè)客戶端,而這些客戶端需要隨時(shí)發(fā)送消息和接受消息,所以收發(fā)消息需要放入不同的線程中。

2)、多客戶聊天并不是多個(gè)客戶之間進(jìn)行兩兩通信,而是需要所有客戶端與服務(wù)端進(jìn)行交互,再由服務(wù)端統(tǒng)一下發(fā)信息到其他參與聊天的客戶端。

2. 代碼實(shí)現(xiàn):

2.1 實(shí)現(xiàn)專用于接收消息的子線程ReceiveThread

將接收消息和發(fā)送消息分為兩個(gè)線程,其中將發(fā)送消息寫入主線程中,開啟新的線程用于接收消息。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReceiveThread extends Thread{

 private Socket socket; //私有的成員變量,套接字
 
 public ReceiveThread(Socket socket) {
  this.socket = socket;
 }

 @Override
 public void run() {
  BufferedReader br = null;//使用帶緩沖區(qū)的字符輸入流接收信息
  try {
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {
   e.printStackTrace();
  }
  while(true){
   try {
    System.out.println(br.readLine());
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

2.2 客戶端代碼

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
 @SuppressWarnings("all")
 public static void main(String[] args) throws UnknownHostException, IOException {  
        //ip:需要連接的服務(wù)端所在的ip
        //端口:客戶端連接的端口必須和服務(wù)端端口一致
  Socket socket = new Socket("192.168.*.*",8080);
  Scanner scan = new Scanner(System.in);
  new ReceiveThread(socket).start();
  //發(fā)送給服務(wù)端信息
  while(true ){
   PrintStream ps = new PrintStream(socket.getOutputStream());
   ps.println("一號:"+scan.next());  
  }
 }
}

注:

1)、客戶端代碼可以在局域網(wǎng)下的多臺電腦上運(yùn)行,只需要將ip地址改為服務(wù)端的ip,就能夠連接。

2)、如果想要使用同臺電腦完成一個(gè)服務(wù)端和兩個(gè)客戶端運(yùn)行,進(jìn)行測試多人聊天,可創(chuàng)建客戶端2,使用本機(jī)ip

Socket socket = new Socket("127.0.0.1",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
//發(fā)送給服務(wù)端信息
while(true ){
    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("二號:"+scan.next());  
}

2.3 服務(wù)端接收和轉(zhuǎn)發(fā)信息的線程ServerThread

服務(wù)端在每一個(gè)客戶端進(jìn)行連接時(shí),都會產(chǎn)生一個(gè)線程,用于服務(wù)這個(gè)客戶,負(fù)責(zé)接收該客戶發(fā)送的信息,并轉(zhuǎn)發(fā)到參與多人聊天的其他客戶。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.Set;

public class ServerThread  extends Thread{

 private Socket socket;
 
 public ServerThread(Socket socket) {
  this.socket = socket;
 }
 @Override
 public void run() {
  BufferedReader br = null;
  String str=null;
  try {
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {
   e.printStackTrace();
  }
  while(true){
   try {
    str=br.readLine();
                //在服務(wù)端輸出,可以監(jiān)測到所有人的聊天信息。
    System.out.println(str);
    
    //發(fā)送到其他客戶端
    Set<Entry<InetAddress, Socket>> entrySet = Server.map.entrySet();
    for (Entry<InetAddress, Socket> entry : entrySet) {
     InetAddress key = entry.getKey();
     Socket value = entry.getValue();
     if(socket.getInetAddress()!=key){
      PrintStream printStream = new PrintStream(value.getOutputStream());
      printStream.println(str);
     }
    }
    
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

2.4 服務(wù)端代碼

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;

public class Server {
 @SuppressWarnings("all")
    
 public static ConcurrentHashMap<InetAddress, Socket> map =new ConcurrentHashMap<>();
 public static void main(String[] args) throws IOException, InterruptedException {

  //創(chuàng)建服務(wù)端的ServerSocket
  ServerSocket server = new ServerSocket(8080);
  while(true){
            //接收到客戶連接就創(chuàng)建一個(gè)對應(yīng)的套接字
   Socket socket = server.accept();
            //獲取該客戶的ip
   InetAddress inetAddress = socket.getInetAddress();
   //將該客戶的ip和套接字裝入map集合
   map.put(inetAddress, socket);
            //創(chuàng)建新的線程服務(wù)該客戶
   new ServerThread(socket).start();
  }  
 }
}

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

相關(guān)文章

  • java實(shí)現(xiàn)雷霆戰(zhàn)機(jī)

    java實(shí)現(xiàn)雷霆戰(zhàn)機(jī)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雷霆戰(zhàn)機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 探索分析Redis?AOF日志與數(shù)據(jù)持久性

    探索分析Redis?AOF日志與數(shù)據(jù)持久性

    這篇文章主要為大家介紹了探索分析Redis?AOF日志與數(shù)據(jù)持久性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于Java中UDP的廣播形式(實(shí)例講解)

    基于Java中UDP的廣播形式(實(shí)例講解)

    下面小編就為大家分享一篇基于Java中UDP的廣播形式(實(shí)例講解),具有很好的參考價(jià)值,希望對大家有所幫助
    2017-12-12
  • Java泛型中的通配符舉例詳解

    Java泛型中的通配符舉例詳解

    Java泛型中的通配符是指使用"?"來表示未知類型,可以用于定義泛型類、泛型方法和泛型接口,下面這篇文章主要給大家介紹了關(guān)于Java泛型中通配符的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Spring Boot2如何構(gòu)建可部署的war包

    Spring Boot2如何構(gòu)建可部署的war包

    這篇文章主要介紹了Spring Boot2如何構(gòu)建可部署的war包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 深入了解Java GC的工作原理

    深入了解Java GC的工作原理

    下面小編就為大家?guī)硪黄钊肓私釰ava GC的工作原理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 關(guān)于Java三大特性之多態(tài)的總結(jié)

    關(guān)于Java三大特性之多態(tài)的總結(jié)

    這篇文章主要介紹了關(guān)于Java三大特性之多態(tài)的總結(jié),內(nèi)容詳細(xì),涉及多態(tài)的定義,存在條件,好處,分類及實(shí)現(xiàn)方式等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • SpringBoot入門教程詳解

    SpringBoot入門教程詳解

    SpringBoot?是由?Pivotal?團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化?Spring?應(yīng)用的初始搭建以及開發(fā)過程。本文將詳細(xì)為大家講講SpringBoot是使用,需要的可以參考一下
    2022-06-06
  • Go Java算法之從英文中重建數(shù)字示例詳解

    Go Java算法之從英文中重建數(shù)字示例詳解

    這篇文章主要為大家介紹了Go Java算法之從英文中重建數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

晋州市| 云梦县| 梨树县| 泽库县| 太康县| 铁岭县| 枣庄市| 昭觉县| 常熟市| 抚远县| 田东县| 杭锦后旗| 磐石市| 西城区| 舞阳县| 同德县| 百色市| 柏乡县| 嘉黎县| 兴化市| 理塘县| 八宿县| 锡林郭勒盟| 正阳县| 洞口县| 上犹县| 吴堡县| 博客| 河东区| 搜索| 镇安县| 九龙坡区| 栖霞市| 靖远县| 大新县| 芮城县| 武陟县| 固始县| 黔东| 井冈山市| 惠来县|