標籤:ref 很多 提示 協議 images red 發送 最大 robot
接下來我們嘗試實現最簡單的Socket用戶端,為了確保只可能你的代碼有問題,伺服器要先用別人成熟的代碼測試(這也是編程的一個技巧,先不要用自己寫的用戶端測試自己寫的伺服器,這樣出了問題你也不知道誰有問題,也可能都有問題,而是一樣一樣來,拿不準的先用別人的),先開啟這個Socket伺服器
?
嘗試串連到伺服器,只要參照網上的做法,調用Socket的connect方法和disconnect方法即可(把指定的IP地址和連接埠按照要求轉成IPEndPoint類型),可以發現SocketTest軟體確實就不但的提示New Client和Client closed connection,這也是我們後面要學習的,做用戶端的時候如果串連成功了要提示,做伺服器如果有用戶端串連成功了也要提示。
?
如果為了更加嚴謹可以在轉換之前先判斷是否是合格的IP地址和連接埠,IP地址網上可以找到很多檢測的手段,每個XXX.XXX數值有限制就行了,連接埠我這裡填寫的1234,其實也可以填寫更大或者更小,具體最大值最小值沒有研究過,但是不要填一些已經預設被佔用的連接埠,比如80連接埠預設是http協議,21是預設的ftp連接埠,開啟它的軟體的Port可以看到常規的對TCP連接埠的定義,這些連接埠不要佔用
?
串連完了之後就是考慮給伺服器發訊息,發送資料也比較簡單,注意不能直接發送字串,而是要轉成byte數組(讀者可以去看相關的文字,為什麼要轉成byte數組,可能考慮不同的作業系統,軟體對文本的處理方式不同,所以需要弄成通用的byte位元組流),此外可以發現簡單的Send方法是不支援中文的,他接受到的東西是亂碼(這個問題我們以後再考慮)
?
發送完成之後就要考慮接受伺服器的資料。接收資料比發送麻煩的多,我們這裡示範了最簡單的接收方法(s.Recieve),使用者一旦點擊了接收的按鈕,則視窗都不能動了,這也是同步Socekt通訊的最大的特點(就是收到完畢之後才會接下去幹別的) 。
?
讀者還是想象成賓館的房間,如果用戶端沒有Recieve,伺服器就是往裡發資料了,發完了之後用戶端才Recieve會怎麼樣?測試可以發現如果是伺服器先往Socket扔東西,用戶端接收就會立即執行,當然s.Recieve方法一旦執行完畢,也就不阻塞了,視窗立即能動
?
通過上面兩步的測試,我們發現接收資料會導致程式卡死,那麼如何解決Receive方法導致的整個程式卡死的問題呢?(事實上根本不應該使用者點擊了接收才執行接收,而是隨時可以接收伺服器發過來的資料,如同我們可以隨時給伺服器發訊息一樣),最簡單的方法就是把會卡死的部分放到一個線程中去執行,下面我們只要串連成功,就會啟動線程並陷入死迴圈,線上程中Recieve的阻塞不會導致主程式的卡死
?
但是採集到資料之後如何更新到主介面的東西呢?我們如果線上程中去更新主介面label,textbox都是會報錯的,一旦伺服器點擊了發送按鈕,我們想要更新程式的介面文字框,標籤之類的會提示從不是建立控制項的線程訪問它
?
如果讀者上網查,在程式初始化的時候加上這一條"關閉跨線程訪問控制項檢測"是最簡單粗暴的解決辦法,但是實際上讀者如果做實際項目,有很多個線程用這種方式去更新介面的控制項,程式是不穩定的(你測試一個小時可能沒問題,你連續運行三天就不一定了)。我們下一節會結合事件和委託的方法一併處理這個問題。
?
?
更多教學視頻和資料下載,歡迎關注以下資訊:
我的優酷空間:
http://i.youku.com/acetaohai123
?
我的線上論壇:
http://csrobot.gz01.bdysite.com/
?
問題交流:
QQ:910358960
郵箱:[email protected]
?
?
?
?
?
C#應用視頻教程1.2 Socket通訊用戶端實現