1. 程式人生 > >C#應用視頻教程1.4 實現完整以太網通訊

C#應用視頻教程1.4 實現完整以太網通訊

tcp/ip -1 讀取 site des 完整 深入 cep 運行

對於事件和委托機制不夠理解的讀者可以參考本節提供的委托相關的範例程序,這個是控制臺的程序,比較簡潔(書店發布一本書的事件註冊到某個讀者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),空消息並不是空字符串,你發空字符串可能還是有意義,回車換行之類的,可以直接發一個空的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 實現完整以太網通訊