Discussion:
[問題]JAVA有類似C的shared memory的功能嗎
(时间太久无法回复)
foolish
2006-11-17 05:11:57 UTC
Permalink
而用JAVA NIO 的SocketChannel和ServerSocketChannel的方式,
server端要如何知道現在連上來的client有哪些呢?
我想利用迴圈的方式,對所有連上來的client做廣播訊息的動作,
或是用迴圈找出某一特定的client,並用SocketChannel.write傳送資料,
我是用selector監聽client端的連線情形,
目前server和client端連線已經完成了, echo給client也沒問題.
不過我希望把echo 改成廣播給所有連線的client,
不知道大家看的懂我的問題嗎? Thx.
1. 隨意找了一個link
http://forum.java.sun.com/thread.jspa?threadID=551950&messageID=2698912

2. 不過看你的需求我直覺會想到觀察者模式

3. 另外還有一篇nio的好文可以欣賞一下
http://www.onjava.com/pub/a/onjava/2004/09/01/nio.html

4. ***@tw也討論過廣播的問題
http://www.javaworld.com.tw/jute/post/view?bid=35&id=36218&sty=1&tpg=1&age=0
(忘了在那一篇了,自己翻一下^^)
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-243-48-61.nutn.edu.tw
foolish
2006-11-17 05:36:58 UTC
Permalink
對一些高級領域的東西不熟
也不敢保證那些跟你要的東西有關 Orz (JMS?)
不過,下面是針對實做部份的回答?
※ 引述《Tessa (是我不夠好嗎??)》之銘言:
: 程式執行環境: linux
: 在socket網路程式中,
: 一般C的做法是clinet連到server後 ,會fork一個prosecc處理該client input的訊息,
: 遇到兩個process彼此要相互存取彼此的資訊時 ,
: 在C程式中有shared memory這種功能 ,
: 可讓目前連到server上的數個client彼此傳送一些訊息或是資料,
: 不知道JAVA有沒有類似shared memory的功能可以做到呢?
[廣告語氣] 你可以不用 process 的 [/廣告語氣]
改成用 thread 去處理一個新的 client 就好了
(一般的書都是這樣子教的阿....)
這樣子你可以完全在自己的程式內部維護所有的狀態
而下面的問題也不會是問題了(nio 跟 io 處理方法乾有差??)
a client, a thread是蠻浪費的。

如果thread切換的頻率不高,client也不多倒是可以考慮。

不然時間都花在context-switch上面了。
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-243-48-61.nutn.edu.tw
foolish
2006-11-18 13:47:30 UTC
Permalink
java.nio.Selector吧..
用法應該和linux下的select(), winapi的WSASelect()差不多
就non-blocking IO的觀念
yzugsr您和我有同樣的靈感啊 ^^

俺確實是想到了用new io提供的功能來取代

在1.4版前我們只能用socket與thread的搭配 :)

當然較古早的變通方法可以用jni來實作出nonblocking socket ^^
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-59-94-161.nutn.edu.tw
foolish
2006-11-18 13:49:30 UTC
Permalink
MultiThread 的 Worker Pattern 吧
http://www.java2s.com/Code/Java/Design-Pattern/WorkerThreadPatterninJava.htm
也就是少數幾個 thread, 處理很多個 Client
感謝您的分享

讓俺又多認識了一個pattern

不過您寫的心得好像只在ptt的站內,實在可惜

也許能分享出來增加這pattern被認識的機會呦
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-59-94-161.nutn.edu.tw
foolish
2006-11-18 13:54:03 UTC
Permalink
※ 引述《H45 (!H45)》之銘言:
: MultiThread 的 Worker Pattern 吧
: http://www.java2s.com/Code/Java/Design-Pattern/WorkerThreadPatterninJava.htm
: 也就是少數幾個 thread, 處理很多個 Client
請好好的解讀一下它在寫什麼, 有什麼情形可以這樣做, 什麼情形
不能這樣做. 不要只丟出一個code, 就當作是哪麼一回事.
簡單的講, 如果一個thread 要做的事就像該example 哪麼簡單,
還需要你來寫程式嗎?
Lordaeron,

H45只是提供可行的一種方向,為何要如此嚴厲地批評呢?

多認識一些方法,在面對問題時有更多的選擇是件好事啊!

何況我們眾人回答問題時心中所設想與能體會到的情況實在很難比較

以自身的理解去攻詰對方的觀點,似乎有所不妥
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-59-94-161.nutn.edu.tw
foolish
2006-11-18 13:56:25 UTC
Permalink
: a client, a thread是蠻浪費的。
: 如果thread切換的頻率不高,client也不多倒是可以考慮。
: 不然時間都花在context-switch上面了。
不然可行性是如何做呢? 不a client , a thread 哦, 怕時間都花在context-switch上面
如何做呢?
俺只是藉著之前分享的文章講了一些作者說明的困境,
而我也覺得小有認同罷了:)

<%
About one year ago, a client of the company where I work asked us to develop
a router for telephony protocols (i.e., protocols used for communication
between a SMS center and external applications). Among the requirements was
that a single router should be able to support at least 3,000 simultaneous
connections.

It was clear that we could not use the traditional thread-pooling approach.
Most thread libraries do not scale well, because the time required for
context switching increases significantly with the number of active threads.
With a few hundred active threads, most CPU time is wasted in context
switching, with very little time remaining for doing real work. As an
alternative to thread pooling, we decided to use I/O multiplexing. In this
approach, a single thread is used to handle an arbitrary number of sockets.
This allows servers to keep their thread count low, even when operating on
thousands of sockets, thereby improving scalability and performance
significantly. Unfortunately, there is a price to pay: an architecture based
on I/O multiplexing is significantly harder to understand and to implement
correctly than one based on thread pooling.
%>
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: pc210-59-94-161.nutn.edu.tw
蒙古大夫
2006-11-19 10:46:28 UTC
Permalink
因為有人嚴厲質疑,就不想分享自己的看法、不回應別人的質疑
說實在的,那也不過就是變相的一言堂
怎麼覺得你比較一言堂?網路上要不要回應別人的質疑是人家的自由,
這不是義務,這些本質請先理清,否則只不過是在吵架罷了,吵要用你
的 style,還是要用我的 style。
我還以為,技術人員通常首要追求的是真理
從 Ruby 版事件跟這次事件,我開始有點懷疑
我們這邊沒有 ruby 版,如果是貴站的新仇舊恨,或者你想教訓貴站你
轄下的子民,請 local save,謝謝。

我的 style 是,我話講完了,我先走了,不必相送……



ps.版大要 d 這篇,請不必覺得不好意思。
--
有些人有種奇怪的想法 -- 認為一些客觀知識的總合即為智慧。
(林語堂.啼笑皆非)
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: edt1023.sayya.org

继续阅读narkive:
Loading...