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()); }
【java实现多客户聊天功能】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 ServerThreadextends 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> entrySet = Server.map.entrySet(); for (Entry entry : entrySet) {InetAddress key = entry.getKey(); Socket value = https://www.it610.com/article/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 ConcurrentHashMapmap =new ConcurrentHashMap<>(); public static void main(String[] args) throws IOException, InterruptedException {//创建服务端的ServerSocketServerSocket server = new ServerSocket(8080); while(true){//接收到客户连接就创建一个对应的套接字Socket socket = server.accept(); //获取该客户的ipInetAddress inetAddress = socket.getInetAddress(); //将该客户的ip和套接字装入map集合map.put(inetAddress, socket); //创建新的线程服务该客户new ServerThread(socket).start(); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询