java实现多客户聊天功能

 更新时间:2021年08月27日 12:24:51   作者:最好的硕硕  
这篇文章主要为大家详细介绍了java实现多客户聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

java 实现多客户端聊天(TCP),供大家参考,具体内容如下

1. 编程思想:

1)、要想实现多客户端聊天,首先需要有多个客户端,而这些客户端需要随时发送消息和接受消息,所以收发消息需要放入不同的线程中。

2)、多客户聊天并不是多个客户之间进行两两通信,而是需要所有客户端与服务端进行交互,再由服务端统一下发信息到其他参与聊天的客户端。

2. 代码实现:

2.1 实现专用于接收消息的子线程ReceiveThread

将接收消息和发送消息分为两个线程,其中将发送消息写入主线程中,开启新的线程用于接收消息。

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;//使用带缓冲区的字符输入流接收信息
  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:需要连接的服务端所在的ip
        //端口:客户端连接的端口必须和服务端端口一致
  Socket socket = new Socket("192.168.*.*",8080);
  Scanner scan = new Scanner(System.in);
  new ReceiveThread(socket).start();
  //发送给服务端信息
  while(true ){
   PrintStream ps = new PrintStream(socket.getOutputStream());
   ps.println("一号:"+scan.next());  
  }
 }
}

注:

1)、客户端代码可以在局域网下的多台电脑上运行,只需要将ip地址改为服务端的ip,就能够连接。

2)、如果想要使用同台电脑完成一个服务端和两个客户端运行,进行测试多人聊天,可创建客户端2,使用本机ip

Socket socket = new Socket("127.0.0.1",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
//发送给服务端信息
while(true ){
    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("二号:"+scan.next());  
}

2.3 服务端接收和转发信息的线程ServerThread

服务端在每一个客户端进行连接时,都会产生一个线程,用于服务这个客户,负责接收该客户发送的信息,并转发到参与多人聊天的其他客户。

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();
                //在服务端输出,可以监测到所有人的聊天信息。
    System.out.println(str);
    
    //发送到其他客户端
    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 服务端代码

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 {

  //创建服务端的ServerSocket
  ServerSocket server = new ServerSocket(8080);
  while(true){
            //接收到客户连接就创建一个对应的套接字
   Socket socket = server.accept();
            //获取该客户的ip
   InetAddress inetAddress = socket.getInetAddress();
   //将该客户的ip和套接字装入map集合
   map.put(inetAddress, socket);
            //创建新的线程服务该客户
   new ServerThread(socket).start();
  }  
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring MVC DispatcherServlet处理请求过程示例详解

    Spring MVC DispatcherServlet处理请求过程示例详解

    这篇文章主要介绍了Spring MVC DispatcherServlet处理请求过程示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot条件注解@Conditional详细解析

    SpringBoot条件注解@Conditional详细解析

    这篇文章主要介绍了SpringBoot条件注解@Conditional详细解析,@Conditional是Spring4.0提供的一个用于条件装配的注解,其定义了一个Condition的数组,只有当数组所有的条件都满足的时候,组件才会被导入容器,需要的朋友可以参考下
    2023-11-11
  • spring带bean和config如何通过main启动测试

    spring带bean和config如何通过main启动测试

    这篇文章主要介绍了spring带bean和config,通过main启动测试,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解

    这篇文章主要介绍了Java try catch finally异常处理组合详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 详解springmvc拦截器拦截静态资源

    详解springmvc拦截器拦截静态资源

    本篇文章主要介绍了详解springmvc拦截器拦截静态资源,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • 基于Java回顾之JDBC的使用详解

    基于Java回顾之JDBC的使用详解

    本篇文章是对Java中JDBC的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java之ThreadPoolExecutor类详解

    Java之ThreadPoolExecutor类详解

    这篇文章主要介绍了Java之ThreadPoolExecutor类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 浅谈Java数组的一些使用方法及堆栈存储

    浅谈Java数组的一些使用方法及堆栈存储

    下面小编就为大家带来一篇浅谈Java数组的一些使用方法及堆栈存储。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • springboot时间格式化的五种方法总结(解决后端传给前端的时间显示不一致)

    springboot时间格式化的五种方法总结(解决后端传给前端的时间显示不一致)

    这篇文章主要给大家介绍了关于springboot时间格式化的五种方法,文中介绍的方法解决了后端传给前端的时间显示不一致,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 详解Spring Bean的配置方式与实例化

    详解Spring Bean的配置方式与实例化

    本文主要带大家一起学习一下Spring Bean的配置方式与实例化,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的可以参考一下
    2022-06-06

最新评论