複習完關於通訊的知識點後,我們要動手完成乙個"多人聊天室"的小專案練習,這個專案涉及到了通訊,執行緒,事件監聽和圖形的程式設計的相關概念,乍一聽上去覺得很容易,不就是加個圖形介面嗎?後來實現的時候發現不是這樣,發現幾乎寸步難行,有點焦急,但是急也沒用,程式這個東西是需要人靜下心來思考才好得到結果的.於是我開始靜下心來思考。
首先我要寫的是乙個多人聊天室,這意味著我的serversocket類肯定不能只呼叫一次accept()方法,於是我記下第一點問題
1比起以前的單對單聊天程式,這一次的serversocket處需要做出相應處理
我的對應的解決辦法是使用執行緒,我建立了乙個實現了runnable介面的mythread類,然後把關於接收到socket後的步驟通通交給了我寫的執行緒類去處理,**部分如下
while(true)
2既然是多人聊天室,那麼伺服器在這裡充當的作用應該是廣播作用,即把收到的訊息**給所有客戶端,所以這裡伺服器應該獲取到所有客戶端的socket,然後在將讀到的資訊迴圈傳送給每個使用者,我使用的辦法是使用了乙個靜態的向量用來儲存所有伺服器針對客戶端而創立的執行緒(即所有mythread),然後傳送資訊的時候直接使用這個向量取出socket即可,具體**如下
public static vectorvs=new vector();
public void run() {
// 暫時無限制的反饋資訊
try {
bufferedreader br = new bufferedreader(new inputstreamreader(
socket.getinputstream()));
printwriter pw ;
// 為連線的使用者建立乙個id號
random rand = new random();
int idone = rand.nextint(1000);
string msg;
while (true) {// 把讀到的資訊列印出來
msg = br.readline();
system.out.println(idone + "說:" + msg);
// 然後反饋給每乙個socket使用者
for(int i=0;i
上面是我寫的一段用來時刻監聽伺服器有沒有發資訊過來的執行緒run()方法,然後在while迴圈裡面我用readline()方法將讀到的字串儲存到變數msg中,然後列印,上面可以看到我這個執行緒的休眠時間是300ms,按照我的設想來看它應該是列印一連串的空字串的,結果卻是只有在接收到了字串以後,程式才會繼續執行下去,我看到結果馬上茅塞頓開了,原來在讀資料的時候程式不會繼續往下執行,而是呈阻塞態,如此一來我擔心的大問題基本上全都解決了。
想到這裡我的思路已經很清晰了,於是在乙個很輕鬆愜意的狀態下寫完了整個專案。
總結:寫乙個專案之前先應該好好靜下心來思考,考慮到需要用到的各個知識點,以及如何去分布實現它們,然後一步步的去實現,這麼做比發散性思考效率要來的更高。
附件中是這個專案的源**
TCP多人聊天室實現簡單思路
1.1 分析客戶端 功能 1.資料傳送 2.資料接收 技術 1.socket 2.輸入流和輸出流 3.多執行緒,客戶端功能模組有兩個執行緒 聊天 1.群聊 2.私聊 私聊字首 伺服器使用者id號 msg 伺服器功能 1.資料 2.使用者註冊 技術 1.serversocket 2.每乙個使用者對應的...
UDP多人聊天室
多人聊天室 chat room 客戶端功能 傳送請求,獲取結果 from socket import from multiprocessing import process import sys 伺服器位址 addr 127.0.0.1 8888 接收訊息 def recv msg s while ...
簡單的多人聊天室
1.安裝nodejs websocket 和 socket.io npm install nodejs websocket socket.io 2.html 中引入socket.io.js檔案 在html中 通過 socket io ws localhost 3000 開啟socket連線,通過so...