Discussion:
[問題] 關於thread間交換訊息的問題
(时间太久无法回复)
michaelz
2006-10-24 20:55:23 UTC
Permalink
我想做一個類似聊天室的程式, 有一個server負責listen,當有client連線進來時
就分一個thread去處理. 如何讓一個client的訊息可以送到其他所有的client呢
另外server也可能有幾個物件會要送到所有的client.
聊天室的部分目前想到是設一個static的物件然後所有的client定時去讀再判斷有沒改變
至於 server那部現在還想不到..請問有什麼好的方法嗎?..thx

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 69.255.250.222
好累想睡覺
2006-10-24 23:23:39 UTC
Permalink
※ 引述《michaelz (michaelz)》之銘言:
: 我想做一個類似聊天室的程式, 有一個server負責listen,當有client連線進來時
: 就分一個thread去處理. 如何讓一個client的訊息可以送到其他所有的client呢
: 另外server也可能有幾個物件會要送到所有的client.
: 聊天室的部分目前想到是設一個static的物件然後所有的client定時去讀再判斷有沒改變
: 至於 server那部現在還想不到..請問有什麼好的方法嗎?..thx
我之前也有看過類似的程式...

先在 server 宣告一個 ArrayList 或是 LinkList

假設 client 是個類別

每當有人連到 server 的時候就 new 一個 client 的實體

接著將 client 的實體加入到之前宣告的 List 中

若是要進行廣播的話 就是對 List 內的 client 實體都送出訊息

若是 client 斷線的話 也要把 List 內對應的 client 刪除

這些都只是個大概 細節部分像是 client 的類別要怎麼設計 , Thread 要怎麼分配

還需要花時間思考一下

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.118.51
※ 編輯: aeifkz 來自: 163.25.118.51 (10/25 15:23)
ing
2006-10-24 23:39:45 UTC
Permalink
※ 引述《michaelz (michaelz)》之銘言:
: 我想做一個類似聊天室的程式, 有一個server負責listen,當有client連線進來時
: 就分一個thread去處理. 如何讓一個client的訊息可以送到其他所有的client呢
: 另外server也可能有幾個物件會要送到所有的client.
: 聊天室的部分目前想到是設一個static的物件然後所有的client定時去讀再判斷有沒改變
: 至於 server那部現在還想不到..請問有什麼好的方法嗎?..thx
http://programming.im.ncnu.edu.tw/J_Chapter9.htm

找 notifyAll()

----
然後把網站的內容看一看,應該對觀念有不少幫助 :)
----
這是我修java的時候,老師的課程網站。現在有時候寫一寫還是會回去查 XD

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.22.18.89
Alien
2006-10-25 01:59:44 UTC
Permalink
※ 引述《michaelz (michaelz)》之銘言:
: 我想做一個類似聊天室的程式, 有一個server負責listen,當有client連線進來時
: 就分一個thread去處理. 如何讓一個client的訊息可以送到其他所有的client呢
: 另外server也可能有幾個物件會要送到所有的client.
: 聊天室的部分目前想到是設一個static的物件然後所有的client定時去讀再判斷有沒改變
: 至於 server那部現在還想不到..請問有什麼好的方法嗎?..thx

找找 producer consumer queue 之類的東西吧.

不然就用 thread pool 之類配合 observer pattern.
一個 client 用一條 thread, 如果多人連進來的話可
是很難負荷的

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.72.0.45
Pao
2006-10-25 04:14:50 UTC
Permalink
※ 引述《michaelz (michaelz)》之銘言:
: 我想做一個類似聊天室的程式, 有一個server負責listen,當有client連線進來時
: 就分一個thread去處理. 如何讓一個client的訊息可以送到其他所有的client呢
: 另外server也可能有幾個物件會要送到所有的client.
: 聊天室的部分目前想到是設一個static的物件然後所有的client定時去讀再判斷有沒改變
: 至於 server那部現在還想不到..請問有什麼好的方法嗎?..thx

如果不考慮效率還是有的沒的、雜七雜八的話。
我的偷懶方式如下:

使用簡單的Socket去作。

Server負責分派每個Client一個Thread去服務。
同時也將每個Thread放進List裡面,傳給新分派的Thread。

(當然這些Thread是要被繼承過的,得以增加功能)

而每個Thread的工作就是聆聽該client的傳來訊息,
此時Thread當然是被阻斷(Block)在該輸入資料流。

每個Thread要有公開的方法可以讓其他Thread呼叫,
此方法即為傳送訊息到該Client,姑且叫它send方法吧。

然後當某Thread收到訊息時,就呼叫List裡面,每個Thread的send方法。
也就是說收到訊息的Thread,要負責把訊息傳到每個Client去。

過程發現不能傳表示該Client斷線,要順便把該Thread從List移除。
當然某Thread自己發現對方斷線,也要順便把自己從List裡移除。

而這些像send方法、List的新增、刪除等,都要同步化。
不然可能會有某些詭異的事情發生...囧

(當然同步化的競爭,會讓效率降低,不過聊天室應該沒關係吧...^^")

以上是小弟我懶惰的方法,希望會有幫助...

有錯還是有疏忽,還請各位高手糾正及補充...^^"

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.113.65.151

继续阅读narkive:
Loading...