[JAVA]多人聊天室控制檯實現,服務端向所有客戶端下發訊息實現
把專案分為五個模組:客戶端,服務端,寫入執行緒,讀出執行緒,服務端向所有客戶端寫入執行緒。
讀出執行緒
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReadThread extends Thread
{
Socket socket;
String client;
public ReadThread(Socket socket,String client)
{
this.socket = socket;
this.client = client;
}
public void run()
{
try {
String line = "";
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
line = is.readLine();
while (line != null)
{
System.out.println(client+" : "+line);
line = is.readLine();
}
is.close();
socket.close();
} catch (Exception e) {
System.out.println("Error : "+e);
}
}
}
寫入執行緒
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class WriteThread extends Thread
{
Socket socket = null;
String client;
public WriteThread(Socket socket,String client)
{
this.socket = socket;
this.client = client;
}
public void run()
{
try {
PrintWriter os = new PrintWriter(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
String readline = scanner.nextLine();
while (readline != null)
{
os.println(readline);
os.flush();
readline = scanner.nextLine();
}
os.close();
socket.close();
} catch (Exception e) {
System.out.println("Error : "+e);
}
}
}
服務端向所有客戶端下發訊息執行緒,使用到了集合,socket的集合和printwriter的集合
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.Vector;
public class ServerWriteThread extends Thread
{
Vector<Socket> vector = null;
Vector<PrintWriter> oosVector = null;
public ServerWriteThread(Vector<Socket> vector)
{
this.vector = vector;
oosVector = new Vector<PrintWriter>();
}
public void run()
{
try {
while(true)
{
String line;
Scanner scanner = new Scanner(System.in);
line = scanner.nextLine();
if (vector != null)
{
oosVector.clear();
for (int i=0;i<vector.size();i++)
{
try {
Socket socket = vector.elementAt(i);
PrintWriter os = new PrintWriter(socket.getOutputStream());
oosVector.addElement(os);
} catch (Exception e) {
vector.removeElement(i);
}
}
for (int i=0;i<oosVector.size();i++)
{
PrintWriter oos = oosVector.elementAt(i);
oos.println(line);
oos.flush();
}
}
}
} catch (Exception e) {
System.out.println("Error :"+e);
}finally{
//關閉各個連線
if (oosVector != null)
{
for (int i=0;i<oosVector.size();i++)
{
PrintWriter obj = oosVector.remove(i);
obj.close();
}
}
if (vector != null)
{
for (int i=0;i<vector.size();i++)
{
Socket obj = vector.remove(i);
try {
obj.close();
} catch (Exception e2) {
System.out.println("socket關閉出現錯誤 " + e2);
}
}
}
}
}
}
客戶端
import java.net.Socket;
import java.util.Scanner;
public class MultiClient
{
public static void main(String[] args) //throws Exception
{
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入客戶端名稱");
String ClientName = scanner.next();
try {
Socket socket = new Socket("127.0.0.1",5200);
Thread read = new ReadThread(socket,ClientName);
Thread write = new WriteThread(socket,ClientName);
read.start();
write.start();
} catch (Exception e) {
System.out.println("Error :" + e);
}
}
}
服務端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class MultiServer
{
ServerSocket serverSocket = null;
boolean listening = true;
int cliennum = 0;
Vector<Socket> vector = new Vector<Socket>();
public MultiServer()
{
try {
serverSocket = new ServerSocket(5200);
System.out.println("服務端啟動");
ServerWriteThread write = new ServerWriteThread(vector); //向所有客戶端傳送同一訊息
write.start();
while (listening)
{
Socket socket = serverSocket.accept();
cliennum++;
vector.addElement(socket); //將收到的socket加入到集合中
System.out.println("接收到 : "+cliennum+" 客戶端");
String client = "從客戶端["+cliennum+"]:"+"讀取";
Thread read = new ReadThread(socket, client);
read.start();
}
} catch (IOException e) {
System.out.println("無法監聽到埠");
System.exit(-1);
}
try {
serverSocket.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
new MultiServer();
}
}
/*
******逸雨清風 出品
*/
相關文章
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- springboot2整合websocket,實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- java netty 實現 websocket 服務端和客戶端雙向通訊 實現心跳和斷線重連 完整示例JavaNettyWeb服務端客戶端
- IM撤回訊息-iOS客戶端實現iOS客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- Java的oauth2.0 服務端與客戶端的實現JavaOAuth服務端客戶端
- Go基於gRPC實現客戶端連入服務端GoRPC客戶端服務端
- 訊息中介軟體客戶端消費控制實踐客戶端
- 《遠端控制》-服務端實現(一)服務端
- 如何實現從 Redis 中訂閱訊息轉發到 WebSocket 客戶端RedisWeb客戶端
- 實現服務端和客戶端的實時雙向資料傳輸-WebSocket簡單瞭解服務端客戶端Web
- Kubernetes 實戰 —— 05. 服務:讓客戶端發現 pod 並與之通訊(下)客戶端
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- php原生socket實現客戶端與服務端資料傳輸PHP客戶端服務端
- 客戶端骨架屏實現客戶端
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- js程式碼實現多人聊天室JS
- 使用swoole作為MQTT客戶端並接收實現即時訊息推送MQQT客戶端
- JAVA通訊(三)——實現多人聊天Java
- WebSocket 實現伺服器訊息推送客戶端Web伺服器客戶端
- SseEmitter 伺服器向客戶端推送訊息MIT伺服器客戶端
- 從客戶端向服務端發起請求(3種)客戶端服務端
- 001 Rust 網路程式設計,實現 TCP 服務端和客戶端程式Rust程式設計TCP服務端客戶端
- jQuery實現客戶端CheckAll功能jQuery客戶端
- 利用tirpc庫實現簡單的客戶端和服務端RPC客戶端服務端
- 檔案下載之斷點續傳(客戶端與服務端的實現)斷點客戶端服務端
- Java使用HttpClient實現遠端服務呼叫JavaHTTPclient
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- Redis的Pub/Sub客戶端實現Redis客戶端
- 網頁SSH客戶端的實現網頁客戶端
- 微服務架構如何實現客戶端負載均衡微服務架構客戶端負載
- 客戶服務管理:CRM實現緊急應對客戶常見問題
- Golang 實現 Redis(6): 實現 pipeline 模式的 redis 客戶端GolangRedis模式客戶端
- Spring Boot+Socket實現與html頁面的長連線,客戶端給伺服器端發訊息,伺服器給客戶端輪詢傳送訊息,附案例原始碼Spring BootHTML客戶端伺服器原始碼