增加聊天室功能:
1.可以看到是誰發的訊息。
2.實現私聊功能。
實現方法:
對於第乙個功能,可以使用map集合來儲存使用者資訊
第二個功能可以在客戶端傳送不同訊息時,對這些訊息進行處理,比如在訊息內容前後新增一些特殊字元,通過這些特殊字元來判斷。
**實現
特殊字元類:
public inte***ce chatroomprotocol
使用map儲存聊天室所有使用者名稱和對應輸出流之間的對映關係,map類:
伺服器類:public
class chatroommap}}
//獲取所有value組成的set集合
public synchronized setvalueset()
//根據value查詢key
public synchronized k getkeybyvalue(v val)
}return
null;
}//實現put()方法,該方法不允許value重複
public synchronized v put(k key, v value)
}return map.put(key, value);
}}
伺服器執行緒類:public
class server
}//丟擲異常
catch(ioexception e)
}public
static
void
main(string args)
}
客戶端類:public
class
serverthread
extends
thread
public
void
run()else
}//如果讀到的行以chatroomprotocol.private_round開始,並以其結束
//則可以確定是私聊資訊,私聊資訊只向特定的輸出流傳送
else
if(line.startswith(chatroomprotocol.private_round) &&
line.endswith(chatroomprotocol.private_round))
//公聊要向每個socket傳送
string msg = getrealmsg(line);
//遍歷clients中的每個輸出流
for(printstream clientps : server.clients.valueset())}}
//捕獲異常後,表明該socket對應的客戶端已經出現了問題
//所以程式將其對應的輸出流從map中刪除
catch(ioexception e)
if(ps != null)
if(socket != null)
}catch(ioexception ex)}}
//將讀到的內容去掉前後的協議字元,恢復成真實資料
private string getrealmsg(string line)
}
客戶端執行緒類:public
class client
//如果伺服器端返回登陸成功,則結束迴圈
if(result.equals(chatroomprotocol.login_success))}}
//捕獲到異常,關閉網路資源,並退出該程式
catch (unknownhostexception ex)catch (ioexception ex)
//以該socket對應的輸入流啟動clientthread執行緒
new clientthread(brserver).start();
}//定義乙個讀取鍵盤輸出,並向網路傳送的方法
private
void
readandsend()else}}
//捕獲到異常,關閉網路資源,並退出該程式
catch (ioexception ex)
}//關閉socket、輸入流、輸出流的方法
private
void
closers()
if(brserver != null)
if(ps != null)
if(socket != null)
}catch (ioexception ex)
}public
static
void
main(string args)
}
本程式先啟動伺服器,然後啟動多個客戶端。每啟動乙個客戶端,需要填寫乙個使用者名稱,如果使用者名稱重複,便需要重新填寫,如果沒有重複,那麼伺服器便會給其他客戶端傳送新使用者上線。客戶端傳送訊息時,客戶端類會先判斷是公聊還是私聊,然後新增特殊字元,傳送給伺服器。然後伺服器解析資訊,判斷訊息型別,根據不同訊息選擇傳送方式。public
class
clientthread
extends
thread
public
void
run()
}catch (ioexception ex)
//使用finally塊來關閉該執行緒對應的輸入流
finally
}catch (ioexception ex)}}
}
在客戶端編寫訊息時,如果是私聊,然後處理訊息,在訊息內容中前後新增私聊的特殊字元。
例如:
公聊方式:傳送一條私聊,向aa傳送hello
//aa:hello
向這條資訊內容加入特殊字元
實際傳送的內容為:
★【aa※hello★【
傳送公聊,傳送hello
hello
向這條資訊內容加入特殊字元
實際傳送的內容為:
§γhello§γ
QT基於tcp協議網路程式設計
基於qt網路程式設計 基於tcp協議 c s模式程式設計 所需要的類 qtcpserver qtcpsocket 利用qt基於tcp協議編寫c s模式程式 兩個類中的訊號 qtcpserver newconnection qtcpsocket readyread connected disconne...
基於TCP協議的網路程式設計 socket程式設計 1
1.1.網路位元組序 記憶體中的多位元組資料相對於記憶體位址有大端和小端之分,磁碟檔案中的多位元組資料相對於檔案中的偏移位址也有大端小端之分。網路資料流同樣有大端小端之分,那麼如何定義網路資料流的位址呢?傳送主機通常將傳送緩衝區中的資料按記憶體位址從低到高的順序發出,接收主機把從網路上接到的位元組依...
基於tcp的網路程式設計協議分析
在本地電腦的虛擬機器上搭建乙個tcp伺服器,如下 include include include include include include include include define buffer size 128 int main int argc,char ar if argc 3 if...