java 实现多客户端聊天(TCP),供大家参考,具体内容如下
- 编程思维:
1)、要想实现多客户端聊天,首先须要有多个客户端,而这些客户端须要随时发送音讯和承受音讯,所以收发音讯须要放入不同的线程中。
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(); } }}
以上就是本文的全部内容,心愿对大家的学习有所帮忙