socket是通訊端的英文名稱,主要是用於網路編程,在以前vb6時要想使用socket進行程式開發最麻煩的是要自己聲明socket動態庫中的相關函數,而這些函數的參數多不說,還是用c語言編寫的,要讓它門在vb中運行最頭痛的就是要進行函數參數的轉換。經常是為了測試一個參數的轉換是否正確而花上大半天的功夫。
不過現在不同了有了.net,它的System.Net.Sockets 命名空間包含 Windows 通訊端介面的託管實現。而System.Net 命名空間中的所有其他網路訪問類都建立在該通訊端實現之上,有就是說使用System.Net.Sockets和System.Net 命名空間中類可以完成通過socket動態庫中的幾乎全部功能,但是又避免了參數轉化的麻煩。(.NET Framework的 Socket 類是 Winsock32 API 提供的通訊端服務的Managed 程式碼版本。大多數情況下,Socket 類方法只是將資料封送到它們的本機 Win32 副本中並處理任何必要的安全檢查。)
Socket 類支援兩種基本模式:同步和非同步。在同步模式中,對執行網路操作的函數(如 Send 和 Receive)的調用一直等到操作完成後才將控制返回給調用程式。在非同步模式中,這些調用立即返回。本文將討論同步模式,因為同步模式是基礎。
程式說明:(本文中的程-序需要使用者編寫兩個執行個體才可以完成。)
發送方:在使用通訊端通訊之前,必須使用協議和網路地址資訊初始化通訊端。Socket 類的建構函式具有指定通訊端用來建立串連的地址族、通訊端類型和協議類型的參數。然後指定要發送到目標機器的ip地址和連接埠號碼。在將要發送資料發送的位元組數組傳遞到 Socket 類的資料發送方法Send 和 SendTo之一本文使用send方法。最後關閉socket終止發送。
'發送端代碼Public Class Form1 Inherits System.Windows.Forms.FormPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bytes(1024) As Byte'聲明位元組數組 Dim sender1 As New System.Net.Sockets.Socket (Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) '初始化socket Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(TextBox1.Text) '對發送的資料進行編碼'***************************'指定ip和連接埠 Dim ipHostInfo As System.Net.IPHostEntry = System.Net.Dns.Resolve("d") Dim ipAddress As System.Net.IPAddress = ipHostInfo.AddressList(0) Dim ipe As New System.Net.IPEndPoint(ipAddress, 11000)'********************** sender1.Connect(ipe)'建立串連 Dim bytesSent As Integer = sender1.Send(msg)'發送資料'((((((((('關閉socket sender1.Shutdown(Net.Sockets.SocketShutdown.Both) sender1.Close()')))))))End SubEnd Class |
接收端:和發送端一樣先需要初始化通訊端,指定接收方ip和連接埠號碼(匭胗敕⑺頭較嗤ü齃isten方法監聽指定的接收方ip和連接埠號碼,申請串連,使用Receive接收資料,在將資料傳給位元組數組,最後關閉socket。
接收端Public Class Form1 Inherits System.Windows.Forms.Form Dim listener As New System.Net.Sockets.Socket (Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) '初始socketPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load'指定ip和連接埠 Dim ipHostInfo As System.Net.IPHostEntry = System.Net.Dns.Resolve(System.Net.Dns.GetHostName()) Dim ipAddress As System.Net.IPAddress = ipHostInfo.AddressList(0) Dim localEndPoint As New System.Net.IPEndPoint(ipAddress, 11000) listener.Bind(localEndPoint) listener.Listen(10) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bytes() As Byte = New [Byte](1024) {} Dim handler As System.Net.Sockets.Socket = listener.Accept()'建立串連請求 Dim data As String = Nothing bytes = New Byte(1024) {} Dim bytesRec As Integer = handler.Receive(bytes)'接收資料 data += System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRec) TextBox1.Text = data Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data) handler.Shutdown(Net.Sockets.SocketShutdown.Both) handler.Close() End SubEnd Class |
說明:本程式未進行異常處理,所以不可以連續點"接收"鍵,其原因是讓讀者快速掌握.net中的socket編程基礎(如要進行異常處理,請加入try塊,詳情見msdn)。由於本代碼的中資料編碼使用的是英文編碼,所以不支援中文字型(通過對編碼的修改可以發送中文,見msdn)。本文的目的不是教各位編寫聊天程式,所以在看本文時請從socket方面進行思考。本程式在區域網路和internet中測試時都通過了,如果是想在internet中使用本程式,需要將文中的接收和發送方的Dim ipe As New System.Net.IPEndPoint(ipAddress, 11000)語句中的ipaddress修改為真的ip地址並分別將發送和接收安裝於不同ip地址的電腦上。
本程式開發環境vb.net,os是windows 2000。不過在微軟最新的vs.net2003中也可以編寫和編譯本程式。