基于java TCP实现网络通信聊天室《建议收藏附完整源码》
🍅 作者主頁:Java李楊勇?
🍅 簡介:Java領域優質創作者🏆、Java李楊勇公號作者? ?簡歷模板、學習資料、面試題庫、技術互助【關注我,都給你】
🍅 歡迎點贊 👍 收藏 ?留言 📝? ?
🍅 ?文末獲取源碼聯系方式?📝??
1.1 前言
在信息化社會的今天,網絡飛速發展,人們對網絡的依賴越來越多,越來越離不開網 絡,由此而產生的聊天工具越來越多,類似 MSN、QQ,網絡聊天時一類的聊天系統的發展日 新月異,因此產生了制作一個類似 QQ的網絡聊天工具的想法,且通過制作該程序還能更好 的學習網絡軟件編程知識。 網絡編程的目的就是指直接或間接地通過網絡協議與其他計算機進行通訊。 網編程中有兩 個主要的問題, 一個是如何準確的定位網絡上一臺或多臺主機, 另一個就是找到主機后如何 可靠高效的進行數據傳輸。 在 TCP/IP 協議中 IP 層主要負責網絡主機的定位,
數據傳輸的路 由,由 IP 地址可以唯一地確定 Internet 上的一臺主機。 而 TCP層則提供面向應用的可靠的 或非可靠的數據傳輸機制,這是網絡編程的主要對象,一般不需要關心 IP 層是如何處理數 據的。 目前較為流行的網絡編程模型是客戶機
/ 服務器( C/S)結構。 即通信雙方一方作為服 務器等待客戶提出請求并予以響應。 客戶則在需要服務時向服務器提出申請。
服務器一般作 為守護進程始終運行, 監聽網絡端口, 一旦有客戶請求, 就會啟動一個服務進程來響應該客 戶,同時自己繼續監聽服務端口,使后來的客戶也得到響應的服務。
1.2 設計要求
本課程設計的目標是利用套接字 socket ()設計一個聊天程序,該程序基于 C/S 模式, 客戶機器向服務器發聊天請求,服務器應答并能顯示客戶機發過來的信息。
1.3 設計目的
通過設計一個網絡聊天程序,對套接字、數據報通訊、 URL、與 URLConnectiom 的相關知 識有詳細的了解和充分的認識。能將相關的只是運用到相關的實踐中去。
1.4 功能實現
聊天室共分為客戶端和服務端兩部分,
服務器程序主要負責偵聽客戶端發來的消息,
客戶 端需要登錄到相應的服務器才可以實現正常的聊天功能。
服務器的主要功能有
1) 在特定端口上進行偵聽,等待客戶連接
2) 用戶可以配置服務器的監聽端口3) 向已經連接服務器的客戶發送系統消息
5) 當停止服務時,斷開所有用戶的連接
客戶端的主要功能
1) 連接到已經開啟聊天服務的服務端
2) 用戶可以配置要連接服務器端的 ip 地址和端口號
3) 用戶可以配置連接后顯示的用戶名
4) 當服務器開啟時。用戶可以隨時登陸
5) 用戶可以向所有人或一個人發送消息
1.5?知識基礎
應用到的java知識點有:
1. Thread 線程
線程池,線程啟動,接口等。客戶端,服務器端都用到了線程
2. Socket
使用了socket進行端口監聽和數據傳遞
new Socket("localhost",port);3. Swing圖形化
簡單的按鈕,輸入框,彈框等
4. 數據流
字符流包裝、緩沖字符輸出流包裝、
PrintWrite(new OutputStream(new socket(".."),"UTF-8"),true)部分代碼:
定義服務器端的界面,添加事件偵聽與事件處理。調用 start類?Socket方法來實現 服務端用戶上線與下線的偵聽, 調用 Socket類來實現服務器端的消息的 收發。
package chat;import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** 聊天室服務端* @author 李楊勇**/ public class Server {//運行在服務端的Socket 用來接收客戶端的連接。 private ServerSocket server;//線程池private ExecutorService threadPool;//存放所有客戶端輸出流的共享集合private List<PrintWriter> allOut;/*** 構造方法,用來初始化服務端*/public Server(){try {/** 初始化共享集合*/allOut = new ArrayList<PrintWriter>();/** 讀取配置文件* java.util.Properties* */Properties properties = new Properties();/** void load(InputStream in)* 該方法用于讀取給定的流中的數據,然后進行解析* * 我們可以使用FileInputStream這個流來讀取我們* 定義的配置文件config.properties,所以我們可以* 創建這個流,然后將該流作為參數傳給load方法。* 這樣Properties就可以通過FileInputStream讀取* 我們的配置文件了。*/FileInputStream fis = new FileInputStream("config.properties");properties.load(fis);//獲取服務端端口號/** String getProperty(String key)* 給定配置文件中等號左面的內容,可以獲取對應的* 值* serverport=8088*/String port = properties.getProperty("serverport");System.out.println("服務端口:"+port);/** 初始化ServerSocket時要傳入一個參數* 該參數就是服務端對外開啟的服務端口* 客戶端就是通過該端口與服務端進行連接的*/server = new ServerSocket(Integer.parseInt(port));/** 獲取線程的數量阿薩德*/String threadCount = properties.getProperty("threadcount");System.out.println("線程池線程數量:"+threadCount);/** 初始化線程池*/threadPool = Executors.newFixedThreadPool(Integer.parseInt(threadCount));} catch (Exception e) {e.printStackTrace();}}/*** 向共享集合中添加一個輸出流* @param out*/public synchronized void addOut(PrintWriter out){allOut.add(out);}/*** 從共享集合中刪除給定的輸出流* @param out*/public synchronized void removeOut(PrintWriter out){allOut.remove(out);}/*** 遍歷共享集合中的所有輸出流,將給定的消息發送給所有* 的客戶端* @param message*/public synchronized void sendMessageToAllClient(String message){for(PrintWriter out : allOut){out.println(message);}}/*** 服務端開始工作的方法*/public void start(){try {/** Socket accept()* 該方法是ServerSocket開始監聽8088端口,這個方法* 是一個阻塞方法,直到一個客戶端連接為止,若客戶端* 連接了,會返回一個Socket,這個Socket就是用來與* 該客戶端進行通訊的。*/while(true){System.out.println("等待一個客戶端連接...");Socket socket = server.accept();System.out.println("一個客戶端連接了!");/** 啟動一個線程,并將剛剛連接的客戶端的Socket* 傳給它,讓它去處理與這個客戶端的交互。*/ClientHandler clientHandler= new ClientHandler(socket); // Thread t = new Thread(clientHandler); // t.start();threadPool.execute(clientHandler);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Server server = new Server();server.start();}/*** 該內部類是為服務端服務的。用來與一個客戶端進行* 交互的。* @author 李楊勇*/class ClientHandler implements Runnable{/** 該線程用來交互的客戶端的Socket*/private Socket socket;/** 該客戶端的昵稱*/private String nickName;public ClientHandler(Socket socket){this.socket = socket;/** 獲取遠程計算機的地址信息*/InetAddress address = socket.getInetAddress();//獲取遠程計算機的地址String add = address.getHostAddress();System.out.println(add+"上線了!");}public void run() {PrintWriter pw = null;try {/** 通過Socket獲取輸出流,用于將消息發送給* 客戶端*/OutputStream out = socket.getOutputStream();OutputStreamWriter osw= new OutputStreamWriter(out,"UTF-8");pw = new PrintWriter(osw,true);//將該客戶端的輸出流放入共享集合中addOut(pw);/** InputStream getInputStream()* Socket的該方法用來獲取遠程計算機發送過來的數據*/InputStream in = socket.getInputStream();InputStreamReader isr= new InputStreamReader(in,"UTF-8");BufferedReader br = new BufferedReader(isr);/** 首先讀取一行字符串,因為客戶端發送過來的第一* 行字符串是該客戶端的昵稱,讀取到后將其設置到* 屬性nickName上*/nickName = br.readLine();/** 廣播,該用戶上線了*/sendMessageToAllClient("["+nickName+"]上線了");//讀取客戶端發送過來的一行字符串/** 使用BufferedReader的readLine方法讀取客戶端發送* 過來的一行字符串時,由于客戶端所使用的操作系統* 不同,這里在客戶端與服務端斷開連接后,該方法的* 反應是不同的。*/String message = null;while((message = br.readLine())!=null){//將讀取到的內容轉發給所有客戶端sendMessageToAllClient(nickName+"說:"+message);} } catch (Exception e) {} finally{//將該客戶端的輸出流從共享集合中刪除removeOut(pw);//廣播,通知所有客戶端該用戶下線了sendMessageToAllClient("["+nickName+"]下線了.");/** 將該客戶端的socket關閉。* 關閉socket同時也就將使用它獲取的輸入流與* 輸出流關掉了。*/try {socket.close();} catch (IOException e) {}}}}}功能實現截圖:
首先啟動server服務:
?
?然后啟動client:
client可以啟動多個
?
?
這樣一個簡單的基于Java TCP模擬的聊天室完成了?
課程總結:
通過本次課程設計是我對網絡通信的知識有了更深的了解。 加深了對 TCP/UDP協議具體 連接過程的理解。同時對套接字、數據報通訊、 URL、與 URLConnectiom 的相關知識有了充 分的認識。并將這些知識運用到具體的案例中去。本次課程設計不僅運用到套接字的知識, 同時運用到 java 中的 GUI 編程,在設計框架中運用到各種組件與布局,通過服務器和客戶 端主框架的設計, 對 GUI編程中的各種組件和布局有了更清晰地了解。 將書本上所學的知識成功運用到實踐中去。 通過本次課程設計使自己對在 Java 中所學的 Swing 組件, 面板容器, 事件處理,線程的創建、同步,輸入輸出處理,內部類,異常處理,和網絡通信的知識有了 一個復習和運用。培養了自己的編程能力,將學習和實踐結合起來。 在 Java 的學習過程中,往往程序自己看得懂,但是需把所學知識運用到實踐中去時,往 往會遇到這樣那樣的問題, 本次課程設計極大了鍛煉了自己的動手能力, 同時也使自己明白 了只有動手做才會將課本上的知識變為自己的。 只有自己參與實踐, 才能發現問題, 解決問題,在解決問題的過程中提升自己的能力。 希望自己以后能更多的將理論結合實踐,再動手 的過程中提高自己的編程能力和軟件設計能力。
代碼獲取:
java TCP網絡通信聊天室(源碼+報告論文6000字)
相關Java實戰項目精彩推送
基于java ssm springboot+VUE疫情防疫系統系統前后端分離設計和實現
基于java springboot+mybatis電影售票網站管理系統前臺+后臺設計和實現
基于java ssm springboot+mybatis酒莊內部管理系統設計和實現
基于JAVA springboot+mybatis智慧生活分享平臺設計和實現
基于Java springboot+vue+redis前后端分離家具商城平臺系統設計和實現
基于JAVA SSM springboot實現的抗疫物質信息管理系統設計和實現
查看更多博主首頁更多實戰項目 >>>
Java李楊勇?
獲取源碼:
總體來說這個項目功能相對還是比較簡單優秀的、適合初學者作為課程設計和畢業設計參考?
查看下方微信公眾號獲取聯系方式~
精彩系列推薦
Java畢設項目精品實戰案例《100套》
HTML5大作業實戰案例《100套》
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的基于java TCP实现网络通信聊天室《建议收藏附完整源码》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能家居中语音识别算法研究_语音识别研究
- 下一篇: Tomcat 中文路径乱码