2012-05-13 35 views
1

好了,所以我在現場了Oracal在本網站的一些問題圍繞閱讀。我仍然很難理解套接字的一些事情,所以我會看看這裏有沒有人可以花時間向我緩慢的大腦解釋它。我正在做的是建立一個聊天客戶端和聊天服務器(要一舉學習鞦韆和套接字)。儘管我見過所有的例子,但我仍然不清楚他們的工作方式。我知道如何使用輸入流和帶有輸出流的1個套接字來運行1個套接字,但除此之外,我無法理解,因爲這是我找到的大多數資源解釋。這是我關於這個問題的一系列問題。的Java套接字 - 需要幫助理解他們更好地

  1. 如果我希望能夠同時處理輸入和輸出到客戶端,我該怎麼辦?等待,然後如果服務器切換到輸入流並獲得更改,然後切換回輸出流?或者我可以同時運行輸入和輸出流?
  2. 可以說服務器必須同時處理多個客戶端。我必須爲每個客戶端創建一個套接字嗎?你會建議什麼是處理這個問題的好方法?
  3. 比方說,客戶想要改變現有的插座的IP地址或端口,並連接到不同的服務器。我會創建一個新的套接字,還是有一些方法來改變當前的套接字?

這是我的主要問題。如果我能夠理解這一點,我很確定我可以自己找出剩下的需要。

回答

6

這裏有一個很好的指導插座。這不是「Java的插座」本身,但我認爲你會發現它非常有用:

Beej's Guide to Network Programming

回答您的問題:

問:如果我希望能夠處理輸入和輸出到客戶端 同時我會做什麼?

答:你沒有做什麼特別的。套接字自動「雙模態」:您可以隨時閱讀(如果有任何數據)或寫入。

問:假設服務器必須同時處理多個客戶端。我會 必須爲每個客戶端做一個套接字嗎?

答:實際上,系統給你每個新客戶端連接的套接字。你不「創造」一個 - 它是給你的。

每一個新的連接是一個新的socket。

通常,您的服務器會產生一個新線程來爲每個新的客戶端連接提供服務。

問:假設客戶端想要更改其當前套接字的IP地址或端口並連接到不同的服務器。我是否會創建一個新的套接字 ,或者有什麼方法可以更改當前套接字?

答:客戶端將終止現有的連接並打開一個新的連接。

+0

(我會閱讀)謝謝!這真的幫助我理解。我發現的一切都告訴我如何在Java中設置一個套接字,並沒有真正解釋它們是如何工作的。 – cgasser

1

1.-如果我想能夠在同一時間處理輸入和輸出到客戶端,我會做什麼?等待,然後如果 服務器切換到輸入流並獲取更改,然後切換 回到輸出流?或者我可以在 上同時運行一次輸入和輸出流?

它取決於你的協議,如果你的客戶端開始連接,那麼你的服務器在輸出流之前等待輸入併發送一些內容。每個連接,作爲tcp連接,甚至是文件處理都有一個輸入流和一個輸出流。

2.-比方說服務器必須一次處理多個客戶端。我必須爲每個客戶端創建一個套接字嗎?你會建議什麼是 處理這個好方法?

有不同的策略,包括多線程,所以現在專注於流。或保持一個服務器一個客戶端。

3.-比方說,客戶端想改變他們當前套接字的IP地址或端口,並連接到不同的服務器。我只是 創建一個新的套接字,還是有一些方法來改變當前的?

是,插座的定義是通過特定端口的IP地址做是否有這些的改變,你需要一個新的套接字連接。

1

我會試着盡我所能在這裏,但我真的不認爲這是針對這類問題的地方:

首先,你要明白,套接字的抽象底層操作系統套接字(unix套接字,win襪子等)。

這類插座是模型中的傳輸層的面向連接的服務(看OSI模型)。所以這意味着套接字爲客戶提供了一個來自客戶端的字節流和一串字節流到客戶端,所以要回答你的第一個問題,這些流是獨立的。當然,您對通過這些流發言的協議的設計負責。

要回答第二個問題,您需要知道TCP連接如何工作,基本上您的服務器正在監聽一個端口中的一個或多個網絡接口(端口是TCP尋址機制),並且可以處理傳入併發連接的可配置積壓。所以答案是,對於任何傳入連接來說,服務器上的新線程是從線程池創建或獲取的。

要回答你的第三個問題,連接主機之間進行的,所以如果你需要改變其中任何一個,就會有創建一個新的連接的需求。

希望這會有所幫助。

乾杯

+0

一個端口不是一個進程號。積壓與可處理的連接數量無關。你所寫的都不意味着你每個連接都需要一個新的線程。 – EJP

+0

我認爲你在這裏變得太嚴格了,我不是說過程編號= PID,我只是說一個代表正在監聽數據的過程的數字。你不需要每個連接的線程,但這是處理多個客戶端時的一種常見方式,當時我正試圖使其更具說教性而不是先進性。 –

+0

我不同意。我會說你在這裏變得過於sl especially,特別是如果你想要成爲'教誨'。當你說'進程號碼'時,讀者將不可避免地想到PID,而港口首先不是一個過程。你的回答清楚地表明'對於任何傳入的連接你必須創建一個新的線程'。你不這樣做,事先「如此」甚至沒有意義。你可以隨時編輯它。 – EJP