java實現(xiàn)多客戶聊天功能
java 實現(xiàn)多客戶端聊天(TCP),供大家參考,具體內(nèi)容如下
1. 編程思想:
1)、要想實現(xiàn)多客戶端聊天,首先需要有多個客戶端,而這些客戶端需要隨時發(fā)送消息和接受消息,所以收發(fā)消息需要放入不同的線程中。
2)、多客戶聊天并不是多個客戶之間進行兩兩通信,而是需要所有客戶端與服務端進行交互,再由服務端統(tǒng)一下發(fā)信息到其他參與聊天的客戶端。
2. 代碼實現(xiàn):
2.1 實現(xiàn)專用于接收消息的子線程ReceiveThread
將接收消息和發(fā)送消息分為兩個線程,其中將發(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:需要連接的服務端所在的ip
//端口:客戶端連接的端口必須和服務端端口一致
Socket socket = new Socket("192.168.*.*",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
//發(fā)送給服務端信息
while(true ){
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("一號:"+scan.next());
}
}
}
注:
1)、客戶端代碼可以在局域網(wǎng)下的多臺電腦上運行,只需要將ip地址改為服務端的ip,就能夠連接。
2)、如果想要使用同臺電腦完成一個服務端和兩個客戶端運行,進行測試多人聊天,可創(chuàng)建客戶端2,使用本機ip
Socket socket = new Socket("127.0.0.1",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
//發(fā)送給服務端信息
while(true ){
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("二號:"+scan.next());
}
2.3 服務端接收和轉(zhuǎn)發(fā)信息的線程ServerThread
服務端在每一個客戶端進行連接時,都會產(chǎn)生一個線程,用于服務這個客戶,負責接收該客戶發(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();
//在服務端輸出,可以監(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 服務端代碼
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)建服務端的ServerSocket
ServerSocket server = new ServerSocket(8080);
while(true){
//接收到客戶連接就創(chuàng)建一個對應的套接字
Socket socket = server.accept();
//獲取該客戶的ip
InetAddress inetAddress = socket.getInetAddress();
//將該客戶的ip和套接字裝入map集合
map.put(inetAddress, socket);
//創(chuàng)建新的線程服務該客戶
new ServerThread(socket).start();
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud如何使用Eureka實現(xiàn)服務之間的傳遞數(shù)據(jù)
這篇文章主要介紹了SpringCloud使用Eureka實現(xiàn)服務之間的傳遞數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法
這篇文章主要介紹了淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

