天天看點

學習Mina2(知識準備 - socket - 1)

做Java程式設計這麼多年了,今天學習mina架構的時候,确發現自己連socket程式設計都不太了解,真是愧對這幾年的Java學習經驗了。是以在學習mina2前,我首選嘗試者了解一下socket。

1. 先摸索個例子程式

實作功能概述:用戶端向服務端發送一個指令,服務端接受,并發消息給用戶端證明已經收到。如果輸入“end”(不區分大小寫)測試結束。

1.1 socket服務端

1.2 socket用戶端

2 總結

這麼簡單的一個程式,需要多久才能夠調通呢?對我這樣的菜鳥來說折騰了很久。

2.1 遇到的問題和解決方法

[list]

[*] 感覺隻能從用戶端寫一行字元串,然後程式就戛然而止

首選我懷疑是用控制台輸入的問題,開始使用的是System.in來包裝BufferedReader,是以就查了一些資料,發現可以在JDK5下面可以使用[b][color=red]Scanner scanner = new Scanner(System.in);[/color][/b](參考[url]http://www.mkyong.com/java/how-to-read-input-from-console-java/[/url])。使用原始的bufferReader時無法循環的讀取輸入。

[*] 終于可以多行了,但是伺服器端不是實時接收到的,隻有調用close的時候才收到

發現當用戶端程式運作到[b]LOG.info(reader.readLine());[/b]時,就運作不下去了。

于是注釋這句試試,發現可以運作,但是伺服器端貌似不是實時的輸出,開始懷疑是socket緩存的問題(參考[url]http://blog.sina.com.cn/s/blog_616e189f0100s3px.html[/url])。但是無論我怎麼調整伺服器端和用戶端的緩存的大小,都是無法解決。

最後發現是程式是讀取一行的,但是我寫入資料的時候沒有分行符[color=red][b]"\n"[/b][/color]導緻的。加上分行符,問題解決了

[/list]

2.2 學習到了什麼?

[list]

[*] 認識了什麼是Socket,以及socket的基本實作

[*] 認識了socket中還有緩存需要注意的地方

[*] 了解了從控制台中讀取輸入的另外一種方法

[/list]

3. 下面我們會幹點什麼?

[list]

[*] 上面的程式隻能連接配接一次,服務就關閉了,應該改進一下

[*] 多個用戶端連接配接到伺服器端,怎麼互動呢

[/list]