基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng)
1.前言
程序?qū)崿F(xiàn)基于星型結(jié)構(gòu)(服務(wù)器接收來(lái)自各個(gè)客戶(hù)端發(fā)送的信息,然后將信息傳遞給其他客戶(hù)端界面并在其他客戶(hù)端界面顯示發(fā)送的信息)
2.類(lèi)圖
3.代碼
客戶(hù)端代碼:
package netProgram; import java.io.IOException; import java.net.Socket; import java.net.SocketAddress; public class Client implements ScreenInputInterface{ private SocketHandler socketHandler; public void start(){ new Thread(new ScreenInputRunIns(this)).start(); try { socketHandler = new SocketHandler(new Socket("127.0.0.1",666),null); new Thread(socketHandler).start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void send(String msg) { socketHandler.sendMsg(msg); } /* @Override public void send(String msg, SocketAddress address) { socketHandler.sendMsg(msg); }*/ }
服務(wù)端代碼:
package netProgram; import java.io.IOException; import java.net.ServerSocket; import java.net.SocketAddress; import java.util.ArrayList; import java.util.List; public class Server implements ScreenInputInterface{ private List<SocketHandler> clients = new ArrayList<>(); private ServerSocket serverSocket; public void start(){ // new Thread(new ScreenInputRunIns(this)).start(); try { serverSocket = new ServerSocket(666); while (true){ SocketHandler socketHandler = new SocketHandler(serverSocket.accept(),this); clients.add(socketHandler); System.out.println(socketHandler.getSocket().getRemoteSocketAddress()+"進(jìn)入聊天系統(tǒng)"); new Thread(socketHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } @Override public void send(String msg) { for (SocketHandler s:clients) { s.sendMsg(msg); } } /* @Override public void send(String msg, SocketAddress address) { for (SocketHandler s:clients) { if (s.getSocket().getRemoteSocketAddress().equals(address)){ continue; } s.sendMsg(msg); } }*/ public static void main(String[] args) { new Server().start(); } }
屏幕輸入信息接口:
package netProgram; import java.net.SocketAddress; public interface ScreenInputInterface { void send(String msg); // void send(String msg, SocketAddress address); }
用于各個(gè)端口輸入信息的創(chuàng)建的線程對(duì)象:
package netProgram; import java.util.Scanner; public class ScreenInputRunIns implements Runnable{ private ScreenInputInterface screenInputInterface; private Scanner input = new Scanner(System.in); public ScreenInputRunIns(ScreenInputInterface screenInputInterface) { this.screenInputInterface = screenInputInterface; } @Override public void run() {//屏幕實(shí)時(shí)輸入 while (true){ String msg = input.nextLine(); // screenInputInterface.send(msg,null); screenInputInterface.send(msg); } } }
套接字處理器(用于傳輸數(shù)據(jù):實(shí)際發(fā)送信息到輸出流并實(shí)時(shí)監(jiān)聽(tīng)各個(gè)端口的輸入且負(fù)責(zé)顯示):
package netProgram; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class SocketHandler implements Runnable{ private String clientName; private Socket socket; private PrintWriter writer; private Server server; public SocketHandler(Socket socket,Server server) throws IOException { this.socket = socket; this.server = server; clientName = "<"+socket.getLocalSocketAddress()+">"; writer = new PrintWriter(this.socket.getOutputStream()); } public Socket getSocket() { return socket; } public void sendMsg(String msg){ if (server!=null) writer.println(msg); else writer.println(clientName+":"+msg); writer.flush(); } @Override public void run() { while(true){//監(jiān)聽(tīng)輸入流的輸入 try { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String receiveMsg = null; System.out.println(); if ((receiveMsg = reader.readLine())!=null&&!(receiveMsg.equals(""))){ if (server!=null){ // server.send(receiveMsg,socket.getRemoteSocketAddress()); server.send(receiveMsg); }else { System.out.println(receiveMsg); } } } catch (IOException e) { e.printStackTrace(); } } } }
負(fù)責(zé)啟動(dòng)的各個(gè)端口的客戶(hù)端代碼:
package netProgram; public class ClientLinked { public static void main(String[] args) { new Client().start(); } }
package netProgram; public class ClientLinked1 { public static void main(String[] args) { new Client().start(); } }
package netProgram; public class ClientLinked2 { public static void main(String[] args) { new Client().start(); } }
服務(wù)端啟動(dòng)代碼在服務(wù)端類(lèi)的main方法中。
到此這篇關(guān)于基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng)的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)多對(duì)多聊天系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Java實(shí)現(xiàn)互聯(lián)網(wǎng)實(shí)時(shí)聊天系統(tǒng)(附源碼)
- Java?NIO實(shí)現(xiàn)聊天系統(tǒng)
- Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)
- Java 網(wǎng)絡(luò)編程之 TCP 實(shí)現(xiàn)簡(jiǎn)單的聊天系統(tǒng)
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- Java網(wǎng)絡(luò)編程實(shí)例——簡(jiǎn)單模擬在線聊天
- Java使用TCP實(shí)現(xiàn)在線聊天的示例代碼
- Java GUI編程實(shí)現(xiàn)在線聊天室
- Java中使用websocket實(shí)現(xiàn)在線聊天功能
- java實(shí)現(xiàn)在線聊天系統(tǒng)
相關(guān)文章
Java 使用IO流實(shí)現(xiàn)大文件的分割與合并實(shí)例詳解
這篇文章主要介紹了Java 使用IO流實(shí)現(xiàn)大文件的分割與合并實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12springcloud項(xiàng)目占用內(nèi)存好幾個(gè)G導(dǎo)致服務(wù)器崩潰的問(wèn)題
這篇文章主要介紹了springcloud項(xiàng)目占用內(nèi)存好幾個(gè)G導(dǎo)致服務(wù)器崩潰的問(wèn)題,本文給大家分享解決方案供大家參考,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10intellij idea使用git stash暫存一次提交的操作
這篇文章主要介紹了intellij idea使用git stash暫存一次提交的操作,具有很好的參考價(jià)值希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02JetBrains IntelliJ IDEA 配置優(yōu)化技巧
這篇文章主要介紹了JetBrains IntelliJ IDEA 配置優(yōu)化技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Spring Security 實(shí)現(xiàn)“記住我”功能及原理解析
這篇文章主要介紹了Spring Security 實(shí)現(xiàn)“記住我”功能及原理解析,需要的朋友可以參考下2020-05-05SpringBoot?Web開(kāi)發(fā)之請(qǐng)求響應(yīng)、分層解耦問(wèn)題記錄
在?Spring?Boot?的?Web?請(qǐng)求響應(yīng)處理中,Servlet?起著關(guān)鍵的作用,Servlet?是?Java?Web?開(kāi)發(fā)中的基本組件,主要負(fù)責(zé)處理客戶(hù)端的請(qǐng)求并生成響應(yīng),這篇文章主要介紹了SpringBoot?Web開(kāi)發(fā)之請(qǐng)求響應(yīng),分層解耦,需要的朋友可以參考下2024-08-08SpringBoot實(shí)現(xiàn)異步事件Event詳解
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽(tīng)器中執(zhí)行,因?yàn)楸O(jiān)聽(tīng)器中存在失敗的風(fēng)險(xiǎn),所以使用的時(shí)候需要注意,需要的朋友可以參考下2023-11-11解決SpringMvc后臺(tái)接收json數(shù)據(jù)中文亂碼問(wèn)題的幾種方法
本篇文章主要介紹了解決SpringMvc后臺(tái)接收json數(shù)據(jù)中文亂碼問(wèn)題的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01