Java网络编程:TCP实现群聊功能代码
生活随笔
收集整理的這篇文章主要介紹了
Java网络编程:TCP实现群聊功能代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java網絡編程:TCP實現群聊功能代碼
實現的功能:群聊
具體操作流程的大致思路:
某個客戶端發送消息,服務器將該消息轉發給其余客戶端(除了自己)。
代碼一共分兩個端(服務器和客戶端(其中客戶端一共3個代碼)),所以一共5個代碼(下面有顯示代碼)。
【1】客戶端代碼:(三個代碼,其中Send和Receive可以看做被被Client使用創建的,分開封裝而已)
【2】服務器代碼:(一個代碼)
【3】一個工具類Utils代碼:
(1)Send類的代碼:
package chat3;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket;/*** 作用:被MutiClient類用到,是客戶端用來發送消息的* 具體操作是:客戶端讀取控制臺消息--寫入到client的輸出流* @author Administrator**/ public class Send implements Runnable {private BufferedReader console;private DataOutputStream dos;private Socket client;private boolean isRunning;private String name;public Send(Socket client,String name) {this.client=client;this.name=name;console=new BufferedReader(new InputStreamReader(System.in));try {dos=new DataOutputStream(client.getOutputStream());sendMsg(name);//發送名字isRunning=true;} catch (IOException e) {System.out.println("客戶端的send構造器有問題");this.release();}}@Overridepublic void run() {while(isRunning) {//客戶端讀取控制臺消息--寫入到client的輸出流String msg=ConsoleMsg();if(!msg.equals("")) {sendMsg(msg);}}}private String ConsoleMsg() {//先讀取控制臺的內容String msg="";try {msg=console.readLine();} catch (IOException e) {System.out.println("客戶端的ConsoleMsg有問題");this.release();}return msg;}private void sendMsg(String msg) {//再寫入到客戶端的輸出流里try {dos.writeUTF(msg);dos.flush();//這個一定不能忘記啦} catch (IOException e) {System.out.println("客戶端的sendMsg有問題");this.release();}}//釋放資源private void release() {//內部類的使用this.isRunning=false;//釋放資源意味著該該客戶端要停下來Utils.close(dos,client);//自己寫的一個工具類Utils} }(2)Receive類的代碼:
package chat2;import java.io.DataInputStream; import java.io.IOException; import java.net.Socket;/***作用: 被MutiClient類用到,是客戶端用來接收服務器反饋的消息的*客戶端讀取服務器反饋的消息,并顯示輸出* @author Administrator**/ public class Receive implements Runnable {private DataInputStream dis;private Socket client;private boolean isRunning;public Receive(Socket client) {this.client=client;isRunning=true;try {dis=new DataInputStream(client.getInputStream());} catch (IOException e) {System.out.println("客戶端的Receive構造器有問題");release();}}@Overridepublic void run() {while(isRunning) {String msg=receiveMsg();if(!msg.equals("")) {System.out.println(msg);}}}private String receiveMsg() {String msg="";try {msg=dis.readUTF();} catch (IOException e) {System.out.println("客戶端的receiveMsg有問題");release();}return msg;}//釋放資源private void release() {//內部類的使用this.isRunning=false;//釋放資源意味著該該客戶端要停下來Utils.close(dis,client);//自己寫的一個工具類Utils} }(3)Client類的代碼:
package chat3;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException;/**注意:* 在線聊天室:使用容器實現群聊* 客戶端* @author Administrator**/ public class Client {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("---------------client--------------");BufferedReader br=new BufferedReader(new InputStreamReader(System.in));System.out.println("請輸入用戶名:");String name=br.readLine();//建立套接字Socket client=new Socket("localhost", 8983);//客戶端發送消息(先讀取控制臺的內容,再寫入到客戶端的輸出流里)new Thread(new Send(client,name)).start();new Thread(new Receive(client)).start();} }(4)Server類的代碼:
package chat3;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.CopyOnWriteArrayList;/**注意:* 在線聊天室:使用容器實現群聊* 服務器* @author Administrator* 需要修改和遍歷數據的時候使用list會操作不方便* 問題:為什么加了static,在主函數里面就沒錯啦?* */ public class Server {//CopyOnWriteArrayList和list用法一樣private static CopyOnWriteArrayList<Channel> all=new CopyOnWriteArrayList<Channel>();public static void main(String[] args) throws IOException {System.out.println("----------server----------");//創建服務器ServerSocket server=new ServerSocket(8983);while(true) {//阻塞式等待客戶端的連接Socket client=server.accept();System.out.println("一個客戶端連接上。。。");Channel c=new Channel(client);all.add(c);//容器管理所有的成員new Thread(c).start();}}//一個客戶代表一個Channelstatic class Channel implements Runnable{private DataInputStream dis ;private DataOutputStream dos;private Socket client;private boolean isRunning;//程序是否停下來的標志private String name;public Channel(Socket client) {this.client=client;try {dis = new DataInputStream(client.getInputStream());dos=new DataOutputStream(client.getOutputStream());isRunning=true;//獲取名稱name=receiveMsg();this.sendMsg(name+"同學,"+"歡迎您的到來");sendOther(this.name+"加入群聊天室",true);} catch (IOException e) {System.out.println("-----1 出問題----");//自己方便觀察哪里出問題release();//注意:這里做了修改}}//接收消息(服務器讀取客戶端發過來的信息)private String receiveMsg() {String msg="";try {msg=dis.readUTF();} catch (IOException e) {System.out.println("-----receive 出問題----");//自己方便觀察哪里出問題release();//注意:這里做了修改}return msg;}//發送消息(服務器反饋信息給客戶端)private void sendMsg(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println("-----send 出問題----");//自己方便觀察哪里出問題release();//注意:這里做了修改}}//發送消息(服務器反饋信息(其實就是服務器讀取的當前客戶端的消息)給其他所有的客戶端(除了當前客戶端)private void sendOther(String msg,boolean isSysMsg) {for(Channel other:all) {//服務器把收到的客戶端的消息發給其余所有的客戶端(除了當前客戶端)if(other!=this) {if(isSysMsg) {other.sendMsg(msg);//系統消息}else {other.sendMsg(this.name+":"+msg);//群聊消息}}}}//釋放資源private void release() {this.isRunning=false;//釋放資源意味著該該客戶端要停下來Utils.close(dis,dos,client);//自己寫的一個工具類Utilsall.remove(this);//當前客戶端退出sendOther(this.name+"離開了聊天室。。。", true);}@Overridepublic void run() {while(isRunning) {//流程:服務器讀取客戶端消息-服務器發送反饋消息給客戶端-釋放資源String msg=receiveMsg();//System.out.println("服務器讀取到的信息為:"+msg);if(!msg.equals("")) {//sendMsg(msg);sendOther(msg,false);//群聊消息}}//release();//老師這里沒有釋放}} }(5)Utils類的代碼:
package chat4;import java.io.Closeable;/*** 自己寫一個釋放資源的工具類* @author Administrator**/ public class Utils {public static void close(Closeable... targets) {for(Closeable target:targets) {try {if(null!=target) {target.close();}}catch(Exception e){}}} }多嘴一句,如果不會運行該代碼,自行百度一下,就知道啦!!!很關鍵。
運行效果如下:
以上就是Java TCP網絡編程對于群聊模式功能的簡單實現,大家有什么不清楚的,歡迎留言哈(雖然我也很菜的)!!!加油!!!
總結
以上是生活随笔為你收集整理的Java网络编程:TCP实现群聊功能代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 句柄(handle)是什么?
- 下一篇: 句柄是什么