基于Java網(wǎng)絡編程和多線程的多對多聊天系統(tǒng)
1.前言
程序?qū)崿F(xiàn)基于星型結構(服務器接收來自各個客戶端發(fā)送的信息,然后將信息傳遞給其他客戶端界面并在其他客戶端界面顯示發(fā)送的信息)
2.類圖
3.代碼
客戶端代碼:
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); }*/ }
服務端代碼:
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()+"進入聊天系統(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); }
用于各個端口輸入信息的創(chuàng)建的線程對象:
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() {//屏幕實時輸入 while (true){ String msg = input.nextLine(); // screenInputInterface.send(msg,null); screenInputInterface.send(msg); } } }
套接字處理器(用于傳輸數(shù)據(jù):實際發(fā)送信息到輸出流并實時監(jiān)聽各個端口的輸入且負責顯示):
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)聽輸入流的輸入 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(); } } } }
負責啟動的各個端口的客戶端代碼:
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(); } }
服務端啟動代碼在服務端類的main方法中。
到此這篇關于基于Java網(wǎng)絡編程和多線程的多對多聊天系統(tǒng)的文章就介紹到這了,更多相關java實現(xiàn)多對多聊天系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 基于Java實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng)(附源碼)
- Java?NIO實現(xiàn)聊天系統(tǒng)
- Java Socket實現(xiàn)多人聊天系統(tǒng)
- Java 網(wǎng)絡編程之 TCP 實現(xiàn)簡單的聊天系統(tǒng)
- Java網(wǎng)絡編程UDP實現(xiàn)多線程在線聊天
- Java網(wǎng)絡編程實例——簡單模擬在線聊天
- Java使用TCP實現(xiàn)在線聊天的示例代碼
- Java GUI編程實現(xiàn)在線聊天室
- Java中使用websocket實現(xiàn)在線聊天功能
- java實現(xiàn)在線聊天系統(tǒng)
相關文章
Java 使用IO流實現(xiàn)大文件的分割與合并實例詳解
這篇文章主要介紹了Java 使用IO流實現(xiàn)大文件的分割與合并實例詳解的相關資料,需要的朋友可以參考下2016-12-12springcloud項目占用內(nèi)存好幾個G導致服務器崩潰的問題
這篇文章主要介紹了springcloud項目占用內(nèi)存好幾個G導致服務器崩潰的問題,本文給大家分享解決方案供大家參考,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10intellij idea使用git stash暫存一次提交的操作
這篇文章主要介紹了intellij idea使用git stash暫存一次提交的操作,具有很好的參考價值希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02JetBrains IntelliJ IDEA 配置優(yōu)化技巧
這篇文章主要介紹了JetBrains IntelliJ IDEA 配置優(yōu)化技巧,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Spring Security 實現(xiàn)“記住我”功能及原理解析
這篇文章主要介紹了Spring Security 實現(xiàn)“記住我”功能及原理解析,需要的朋友可以參考下2020-05-05SpringBoot?Web開發(fā)之請求響應、分層解耦問題記錄
在?Spring?Boot?的?Web?請求響應處理中,Servlet?起著關鍵的作用,Servlet?是?Java?Web?開發(fā)中的基本組件,主要負責處理客戶端的請求并生成響應,這篇文章主要介紹了SpringBoot?Web開發(fā)之請求響應,分層解耦,需要的朋友可以參考下2024-08-08解決SpringMvc后臺接收json數(shù)據(jù)中文亂碼問題的幾種方法
本篇文章主要介紹了解決SpringMvc后臺接收json數(shù)據(jù)中文亂碼問題的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01