標籤:oid for 錯誤 視頻 socket通訊 基礎上 分配 常式 興趣
對於事件和委託機制不夠理解的讀者可以參考本節提供的委託相關的範常式序,這個是控制台的程式,比較簡潔(書店發布一本書的事件註冊到某個讀者A身上,原理跟前面一小節講的是一致的,只不過沒有通過委託對外發送資料,所以實用性不是很廣,後面還有兩個範例也是對事件和委託的進一步深入)
?
事實上我任意一個控制項雙擊事件進去也是這麼個套路,比如整個程式的載入和關閉事件,我們只是在Form的事件上選幾個滑鼠雙擊進去,貌似直接定位到了方法(private void SocketTest_Load,而且直接為我們寫好了過來的參數),實際上只要找到Designer.cs檔案還是能找到委託和事件的代碼(this就表示這個表單,可以簡單理解為表單的載入/關閉事件發生的時候,去執行SocketTest_Load/SocketTest_FormClosing方法)
?
再來看我們自訂封裝的類使用了事件和委託之後,也變得非常簡潔,可讀寫很強(如果類是靜態,委託也要做成靜態)
?
在理解了事件和委託機制,且實現了用戶端代碼後,我們把伺服器端的代碼也實現,伺服器比用戶端稍微複雜一點,啟動的時候他先會阻阻塞在Accept方法上(直到有用戶端串連上來才會接著往下執行,所以BeginListen方法也要放到線程中執行,如果有用戶端串連上來,則接著建立一個線程不斷擷取讀取用戶端發來的資料)
?
此外跟用戶端不同的地方在於,伺服器需要額外定義一個socket對象(client_socket,如果前面的Accept方法被成功執行,則client_socket就會得到用戶端的IP地址等資訊,後面的給這個用戶端的收發也是通過這個Accept之後執行個體化的client_socket在進行,可想而知,如果是要做1個伺服器對多個用戶端的,每次用戶端串連上就需要分配不同的client_socket對象過去,否則一個client_socket只會儲存一個用戶端的訊息,這樣子一對多,伺服器發的訊息只會跑到最新的串連上來的用戶端那裡)
?
當伺服器主動點擊斷開的時候,還是需要發送一條空訊息(仿照JAVA版的SocketTest),空訊息並不是Null 字元串,你發Null 字元串可能還是有意義,斷行符號換行之類的,可以直接發一個空的byte數組過去,這樣我們前面寫的用戶端收到第一個byte是0的時候就知道要伺服器點擊斷開了
?
最後是對介面整個的重新布局,前面我們用的都是文字框,最好還是用listbox,每次收到資料之後自動重新整理顯示最後一條(也是仿照他的做法,他每次發完之後就把文字框清空了,這個我認為沒有必要)
?
伺服器端要比用戶端稍微功能多一點,重新整理本機IP,設定本機IP都應該是伺服器這邊的功能(而PING一個網路地址應該既不屬於client也不屬於server,所以放在頂部比較合適)
?
最後添加一個LOGO,就可以像JAVA版的SocketTest發布了(添加一個自訂的ICO,可以在程式啟動並執行時候左上方和表徵圖都有顯示)
?
總結:除了同步的方式實現Socket通訊,還有非同步方式,而且除了TCP方式還有UDP方式(廣播的方式,比如一個伺服器對應多個用戶端,伺服器發一條訊息不需要指定給哪個客戶,就是所有客戶都收到),此外基於Socket通訊還產生了很多工業的通訊協議比如ModbusTCP,EtherNetIP(Socekt的TCP/IP通訊就只是簡單規定了收發位元組流byte數組,後面在此基礎上又對位元組流做了很多規定,比如開頭,結尾,資料區段定義,錯誤校正等等,從而形成了更簡潔,更不容易出錯的位元組流,比較規範的叫做資料幀),在這裡都不做詳細的分析,感興趣的讀者可以自己去想辦法實現,最簡單的同步socekt已經夠用了。
1 實現完整的Socket通訊的流程,理解用戶端,伺服器的通訊流程
2 理解定義Socket的伺服器和用戶端的方法,不做成靜態好處(讀者可以自己測試開放多個連接埠和串連多個用戶端的要如何?,如果做成靜態就沒法實現了)
3 理解委託和事件在傳遞訊息方面的優越性,在以後的代碼中除了會把各種方法封裝成類(尤其是基礎教程講了很多字串方法,數學運算方法),還要會規範類的資料處理,最好的方式就是通過委託
?
?
更多教學視頻和資料下載,歡迎關注以下資訊:
我的優酷空間:
http://i.youku.com/acetaohai123
?
我的線上論壇:
http://csrobot.gz01.bdysite.com/
?
問題交流:
QQ:910358960
郵箱:[email protected]
?
?
?
C#應用視頻教程1.4 實現完整乙太網路通訊