当年的聊天室,今天的我(java实现聊天室群聊功能)
生活随笔
收集整理的這篇文章主要介紹了
当年的聊天室,今天的我(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实现聊天室群聊功能)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC环境配置全过程Inte
- 下一篇: 久违的叫醒篇