日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

当年的聊天室,今天的我(java实现聊天室群聊功能)

發布時間:2025/3/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当年的聊天室,今天的我(java实现聊天室群聊功能) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

預備小知識連接:
小小聊天室,慢慢的回憶啊!(TCP 通信實現)


先看效果



主要可以分為三個層:服務端層,客戶端層,還有就是工具層;

  • 服務斷層:包括接收數據,以及轉發數據(數據輸出輸入流);
  • 客戶端層:接收數據以及發送數據(利用鍵盤錄入,轉換流,緩沖流,數據輸入輸出流);
  • 工具層:主要就是用于關閉流的工具類(簡單,粗暴)
  • 創建工具層

    import java.io.Closeable; import java.io.IOException;/*** 用于關閉的工具類* */ public class CloseUtil {public static void closeAll(Closeable... closeable) {for(Closeable c:closeable) {if(c!=null) {try {c.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

    服務層

    服務層線程類

    import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.List;import com.bjsxt.util.CloseUtil; /*** 將獲取每一個客戶端都要執行的代碼,封裝到該類中,并實現Runnable接口,完成多線程* */public class ServerThread implements Runnable{private DataInputStream dis;private DataOutputStream dos;private boolean flag = true;//判斷是否有異常public ServerThread(Socket client) {try {dis = new DataInputStream(client.getInputStream());dos = new DataOutputStream(client.getOutputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dos,dis);ServerMain.list.remove(this);}}// 接收信息的方法public String getMessage() {String str = "" ;try {str = dis.readUTF();} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);ServerMain.list.remove(this);}return str;} // 做出響應的方法public void send(String str) {if(str!=null&&str.length()>0) {try {dos.writeUTF(str);} catch (IOException e) {flag = false;CloseUtil.closeAll(dos);}}}// 轉發消息的方法public void sendOther(String str) {List<ServerThread> list = ServerMain.list;for(ServerThread serverThread : list) {if(serverThread==this) {continue;}serverThread.send(str);}}@Overridepublic void run() {while(flag) {this.sendOther(Thread.currentThread().getName()+":"+"\t"+getMessage());}}}

    創建服務器啟動類

    import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class ServerMain {public static List<ServerThread> list = new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("-------------服務器已啟動-------------------"); // 獲取ServerSocket對象ServerSocket serverSocket = new ServerSocket(10002);while(true) { // 監聽客戶端Socket client = serverSocket.accept();ServerThread st = new ServerThread(client);list.add(st);new Thread(st).start();}}}

    客戶端層

    創建發送信息的線程類

    import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import com.bjsxt.util.CloseUtil;/*** 發送信息的線程* */ public class Sending implements Runnable{private BufferedReader br;private DataOutputStream dos;private boolean flag = true; //判斷是否有異常public Sending() {br = new BufferedReader(new InputStreamReader(System.in));}public Sending(Socket socket) {this();try {dos = new DataOutputStream(socket.getOutputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dos,socket);}}// 接收鍵盤錄入信息方法private String getMessage() {String str = "";try {str = br.readLine();} catch (IOException e) {flag = false; CloseUtil.closeAll(br);}return str;}// 發送信息的方法private void sendf(String str) {try {dos.writeUTF(str);} catch (IOException e) {flag = false;CloseUtil.closeAll(dos);}}// 循環調用發送信息的方法@Overridepublic void run() {while(flag) {this.sendf(getMessage());}}}

    創建接收信息的線程類

    import java.io.DataInputStream; import java.io.IOException; import java.net.Socket;import com.bjsxt.util.CloseUtil;public class Receiving implements Runnable{private DataInputStream dis;private boolean flag = true;public Receiving(Socket socket) {try {dis = new DataInputStream(socket.getInputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);}}// 接收消息的方法public String getMessage() {String str = "";try {str = dis.readUTF();} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);}return str;}// 循環調用獲取消息的方法@Overridepublic void run() {while(flag) {System.out.println(this.getMessage());}}}

    創建客戶端啟動類

    package com.bjsxt.client;import java.io.IOException; import java.net.Socket;/*** 客戶端* */ public class ClientMain {public static void main(String[] args) throws IOException { // 獲取Socket對象 并給定地址與端口號Socket socket = new Socket("127.0.0.1",10002);// 獲取接收信息與發送信息的線程對象Sending sending = new Sending(socket);Receiving receiving = new Receiving(socket);new Thread(sending).start();new Thread(receiving).start();} }

    感覺收看,如果幫到您,點個贊,關個注,評個論唄,葵花在這里感覺不盡!!!

    總結

    以上是生活随笔為你收集整理的当年的聊天室,今天的我(java实现聊天室群聊功能)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。