任何一個可以指導我一個簡單的設計或創意或實現UDP聊天服務器和客戶端共同步驟共同的步驟?我不要求線,我想試試我的自我我正在尋找一種編程語言獨立的解釋。簡單設計或想法或實現UDP聊天服務器和客戶端
在此先感謝
任何一個可以指導我一個簡單的設計或創意或實現UDP聊天服務器和客戶端共同步驟共同的步驟?我不要求線,我想試試我的自我我正在尋找一種編程語言獨立的解釋。簡單設計或想法或實現UDP聊天服務器和客戶端
在此先感謝
經典的設計是,無論用戶在他的聊天客戶端輸入一行文本,該客戶端將文本(以及可能的其他信息,如用戶名)放入發送給服務器。服務器接收UDP數據包,然後將數據包的副本向前轉發給它所知道的所有其他客戶端。當其他客戶端收到轉發的數據包時,它們會分別顯示數據包的內容供本地用戶閱讀。
唯一的非明顯的部分是發現 - 即客戶端如何知道哪個IP地址發送UDP數據包,以及如何在服務器知道哪個IP地址上接收的數據包轉發?
如果你可以保證所有的客戶端總是和服務器在同一個以太局域網上,那麼這很容易處理 - 只要將所有UDP數據包發送到廣播地址(255.255.255.255),並且每個人在局域網上會收到它們。 (事實上,在這種情況下,根本不需要服務器,因爲客戶端可以直接與對方通信)。
在客戶端位於互聯網上的任意位置的更現實的情況下,發現變得有點難度。希望您可以在知名的固定位置(例如www.thabo-chat.com或其他地方)運行服務器,並將該主機名硬編碼到客戶端。然後,無論客戶端何時啓動,它都可以向服務器發送一個UDP數據包,讓服務器知道它存在,並且服務器可以從接收到的UDP數據包中讀取源IP地址,並將其添加到已知客戶端 - 它將轉發收到的數據包的IP地址。它還應該保留每個客戶最近聽到的時間戳,並且如果長時間沒有收到IP地址(爲了避免毫無意義地將數據包發送給已經消失的客戶),請從列表中刪除IP地址。
在互聯網上使用UDP時你將遇到的最後一個問題是,有很多計算機在防火牆後面,阻止來自因特網的UDP數據包,所以你的服務器發送的UDP數據包在很多情況下不會到達它試圖發送給它們的客戶端。沒有一個很好的解決方案 - 你可以讓你的客戶端用戶在他們的路由器上設置UDP端口轉發,但這對他們來說是一個麻煩,而且很多人沒有這方面的技能。在這種情況下,唯一真正的選擇是使用TCP代替,並讓客戶端通過TCP連接到服務器,並以這種方式來回發送數據(這種方式可行,因爲幾乎所有防火牆都允許通過傳出TCP連接進行雙向數據通信,因爲這是網頁瀏覽和電子郵件所必需的)
Python是一個很容易的語言入手: http://wiki.python.org/moin/UdpCommunication
他特別要求獨立於語言的解釋。包括一個鏈接是正確的,但你真的需要在這裏包含足夠的解釋,以便在鏈接過時時保持有意義的答案。 –
感謝這是一個很好的解釋。我從你的答案中得到了一些想法。我也有一個小疑問....:D。我需要維護一個小的dbms在服務器上存儲客戶端的IP地址。?還有更好的主意來維護服務器上的客戶端IP地址嗎?對於遲到的回覆也很抱歉 – Thabo
沒有dbms是必要的,只是一個簡單的內存數據結構。 (例如,在C++中,我可能會使用std :: vector或std :: set,或者甚至只是一個簡單的數組;在Python中,我會使用列表或字典) –
再次感謝......這非常有幫助。 – Thabo