許銳炮
(民航汕頭空管站 技術保障部,廣東 揭東515558)
當前網絡通信日益應用廣泛,以民航汕頭空管站為例,單業(yè)務網就超過5 個,而信息化集中程度越來越多的同時,分布式系統(tǒng)之間的信息傳輸也成為一個研究課題。 而對于傳統(tǒng)的TCP/IP 協(xié)議來說,TCP能提供一種可靠的、有連接的數(shù)據(jù)流服務,IP 協(xié)議則能通過識別IP 地址實現(xiàn)網絡個體的互相通信, 相關文獻也將兩者稱為底層網絡通信。而對比之下,已經成熟應用的Socket 中間件便可以以應用程序的方式存在于各大網絡分布式系統(tǒng),應用日趨廣泛。因此,探討Socket 的運行機制及應用對相關網絡編程和技術維護有一定意義。本文將從實際出發(fā),介紹其在C# 程序編寫中的相關技術及特點。
Socket 是應用層與TCP/IP 協(xié)議族通信的中間軟件抽象層,它是一組接口。 在設計模式中,Socket 作為一個門面模式把復雜的TCP/IP 協(xié)議族隱藏在Socket 接口后面,對開發(fā)人員來說,一組簡單的接口就是全部,讓Socket 去組織數(shù)據(jù),以符合指定的協(xié)議。 它主要由IP 地址和端口號組成。 在TCP/IP 網絡協(xié)議中, 基于服務器客戶端模式的通信上,建立Socket 連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket , 另一個運行于服務器端, 稱為ServerSocket 。 對于ServerSocket 來說主要用于服務器監(jiān)聽, 服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網絡狀態(tài),等待客戶端的連接請求。一旦有請求或者相關命令信息,立即響應。而對于ClientSocket 來說將主動向服務器端套接字發(fā)出連接請求。因此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號, 然后就向服務器端套接字提出連接請求。當服務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
C# Socket 類為網絡通信提供了一套豐富的方法和屬性。 Socket類允許開發(fā)人員使用ProtocolType 枚舉中所列出的任何一種協(xié)議執(zhí)行異步和同步數(shù)據(jù)傳輸。 如果應用程序在執(zhí)行期間只需要一個線程。對于面向連接的協(xié)議的TCP 協(xié)議通信, 服務器可以使用Listen 方法偵聽連接。 Accept 方法則處理任何傳入的連接請求,并返回可用于與遠程主機進行數(shù)據(jù)通信的Socket。 同時可以使用此返回的Socket 來調用Send 或Receive 方法。 調用Bind 方法后便可以要指定本地IP地址和端口號。連接偵聽主機,則可以調用Connect 方法。在數(shù)據(jù)通信上,主要用Send 或Receive 方法。
對 于TCP/IP 的 通 信 在C# 中 可 使 用 Socket、BeginConnect 和EndConnect 方法來連接偵聽主機。 通過使用BeginSend 和EndSend方法,或者使用BeginReceive 和EndReceive 方法,可以進行異步數(shù)據(jù)通信。 與此同時,使用BeginAccept 和EndAccept 處理傳入的連接請求。
而在實際應用中,C# 的Socket 經常需要與多線程配合以解決異步傳輸問題。C# 支持通過多線程并行地執(zhí)行代碼,一個線程有它獨立的執(zhí)行路徑,能夠與其它的線程同時地運行。一個C# 程序開始于一個單線程,這個單線程是被CLR 和操作系統(tǒng)(也稱為“主線程”)自動創(chuàng)建的,并具有多線程創(chuàng)建額外的線程。
作為典型的C/S 模式結構設計,一般情況下包括服務器端軟件設計和客戶端軟件設計,因此服務器端軟件與客戶端軟件不可避免需要對其進行網絡通信編程。以客戶端軟件設計為例,Socket 在C# 中則可以通過以下實現(xiàn):
private IPEndPoint ServerInfo;
private Socket ClientSocket;
private Byte[] MsgBuffer;//信息接收緩存
private Byte[] MsgSend; //信息發(fā)送存儲
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MsgBuffer = new Byte[65535];
MsgSend = new Byte[65535];
this.UserName.Text =Environment.MachineName;
ServerInfo = new IPEndPoint (IPAddress.Parse(this.ServerIP.Text),Convert.ToInt32(this.ServerPort.Text));
ClientSocket.Connect(ServerInfo);
ClientSocket.Send (Encoding.Unicode.GetBytes (" 用 戶: " + this.UserName.Text + " 進入系統(tǒng)! "));
ClientSocket.BeginReceive (MsgBuffer, 0, MsgBuffer.Length,SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
本文討論了Socket 的運行機制以及其在C# 編程中的設計以及相關技術功能,Socket 作為一種應用程序接口其在實際應用中將底層的相關通信協(xié)議等各種技術封裝在程序背后, 為開發(fā)人員提供了快速、高效的開發(fā)方式。 討論其運行機制,對開發(fā)和技術維護有實際意義。
[1]胡晶晶,魯漫紅.基于Java Socket 的聊天室系統(tǒng)設計與實現(xiàn)[J].微處理機,2010,5:66-70.
[2]周譚凱,馬玉祥.網絡通信編程架構研究[J].電子科技,2005(12).
[3]寇海洲,宗慧.利用Socket 實現(xiàn)被動方式實時提醒系統(tǒng)設計[J].淮陰工學院學報,2008(03).