VB.NET环境下的Socket编程举例

前端之家收集整理的这篇文章主要介绍了VB.NET环境下的Socket编程举例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:http://track.cnblogs.com/archive/2005/09/26/244673.aspx

一直以来很想学习Socket编程方面的应用,比如怎样通过Socket编程实现单片机与PC的TCP连接通信。在单片机嵌入网卡芯片与PC进行连接通信,实现PC的web方式对单片机所控制的设备的状态管理,例如智能家居方面的应用。
下面通过例子来学习VB.NET中Net.Sockets类的应用,下面的程序分别分服务器和客户端两部分:

@H_502_6@Visual Basic ---tcpserver Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Imports System.Threading Imports Microsoft.VisualBasic ' State object for reading client data asynchronously Public Class StateObject ' Client socket. Public workSocket As Socket = Nothing ' Size of receive buffer. Public Const BufferSize As Integer = 1024 ' Receive buffer. Public buffer(BufferSize) As Byte ' Received data string. Public sb As New StringBuilder End Class 'StateObject Public Class AsynchronousSocketListener ' Thread signal. Public Shared allDone As New ManualResetEvent(False) ' This server waits for a connection and then uses asychronous operations to ' accept the connection,get data from the connected client,' echo that data back to the connected client. ' It then disconnects from the client and waits for another client. Public Shared Sub Main() ' Data buffer for incoming data. Dim bytes() As Byte = New [Byte](1023) {} ' Establish the local endpoint for the socket. Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName()) Dim ipAddress As IPAddress = ipHostInfo.AddressList(0) Dim localEndPoint As New IPEndPoint(ipAddress,11000) ' Create a TCP/IP socket. Dim listener As New Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) ' Bind the socket to the local endpoint and listen for incoming connections. listener.Bind(localEndPoint) listener.Listen(100) While True ' Set the event to nonsignaled state. allDone.Reset() ' Start an asynchronous socket to listen for connections. Console.WriteLine("Waiting for a connection...") listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback),listener) ' Wait until a connection is made and processed before continuing. allDone.WaitOne() End While End Sub 'Main Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult) ' Get the socket that handles the client request. Dim listener As Socket = CType(ar.AsyncState,Socket) ' End the operation. Dim handler As Socket = listener.EndAccept(ar) ' Create the state object for the async receive. Dim state As New StateObject state.workSocket = handler handler.BeginReceive(state.buffer,StateObject.BufferSize,New AsyncCallback(AddressOf ReadCallback),state) End Sub 'AcceptCallback Public Shared Sub ReadCallback(ByVal ar As IAsyncResult) Dim content As String = String.Empty ' Retrieve the state object and the handler socket ' from the asynchronous state object. Dim state As StateObject = CType(ar.AsyncState,StateObject) Dim handler As Socket = state.workSocket ' Read data from the client socket. Dim bytesRead As Integer = handler.EndReceive(ar) If bytesRead > 0 Then ' There might be more data,so store the data received so far. state.sb.Append(Encoding.ASCII.GetString(state.buffer,bytesRead)) ' Check for end-of-file tag. If it is not there,read ' more data. content = state.sb.ToString() If content.IndexOf("<EOF>") > -1 Then ' All the data has been read from the ' client. Display it on the console. Console.WriteLine("Read {0} bytes from socket. " + vbLf + " Data : {1}",content.Length,content) ' Echo the data back to the client. Send(handler,content) Else ' Not all data received. Get more. handler.BeginReceive(state.buffer,state) End If End If End Sub 'ReadCallback Private Shared Sub Send(ByVal handler As Socket,ByVal data As String) ' Convert the string data to byte data using ASCII encoding. Dim byteData As Byte() = Encoding.ASCII.GetBytes(data) ' Begin sending the data to the remote device. handler.BeginSend(byteData,byteData.Length,New AsyncCallback(AddressOf SendCallback),handler) End Sub 'Send Private Shared Sub SendCallback(ByVal ar As IAsyncResult) ' Retrieve the socket from the state object. Dim handler As Socket = CType(ar.AsyncState,Socket) ' Complete sending the data to the remote device. Dim bytesSent As Integer = handler.EndSend(ar) Console.WriteLine("Sent {0} bytes to client.",bytesSent) handler.Shutdown(SocketShutdown.Both) handler.Close() ' Signal the main thread to continue. allDone.Set() End Sub 'SendCallback End Class 'AsynchronousSocketListener Visual Basic ---tcpclient Imports System Imports System.Net Imports System.Net.Sockets Imports System.Threading Imports System.Text ' State object for receiving data from remote device. Public Class StateObject ' Client socket. Public workSocket As Socket = Nothing ' Size of receive buffer. Public Const BufferSize As Integer = 256 ' Receive buffer. Public buffer(BufferSize) As Byte ' Received data string. Public sb As New StringBuilder End Class 'StateObject Public Class AsynchronousClient ' The port number for the remote device. Private Const port As Integer = 11000 ' ManualResetEvent instances signal completion. Private Shared connectDone As New ManualResetEvent(False) Private Shared sendDone As New ManualResetEvent(False) Private Shared receiveDone As New ManualResetEvent(False) ' The response from the remote device. Private Shared response As String = String.Empty Public Shared Sub Main() ' Establish the remote endpoint for the socket. ' For this example use local machine. Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName()) Dim ipAddress As IPAddress = ipHostInfo.AddressList(0) Dim remoteEP As New IPEndPoint(ipAddress,port) ' Create a TCP/IP socket. Dim client As New Socket(AddressFamily.InterNetwork,ProtocolType.Tcp) ' Connect to the remote endpoint. client.BeginConnect(remoteEP,New AsyncCallback(AddressOf ConnectCallback),client) ' Wait for connect. connectDone.WaitOne() ' Send test data to the remote device. Send(client,"This is a test<EOF>") sendDone.WaitOne() ' Receive the response from the remote device. Receive(client) receiveDone.WaitOne() ' Write the response to the console. Console.WriteLine("Response received : {0}",response) ' Release the socket. client.Shutdown(SocketShutdown.Both) client.Close() End Sub 'Main Private Shared Sub ConnectCallback(ByVal ar As IAsyncResult) ' Retrieve the socket from the state object. Dim client As Socket = CType(ar.AsyncState,Socket) ' Complete the connection. client.EndConnect(ar) Console.WriteLine("Socket connected to {0}",client.RemoteEndPoint.ToString()) ' Signal that the connection has been made. connectDone.Set() End Sub 'ConnectCallback Private Shared Sub Receive(ByVal client As Socket) ' Create the state object. Dim state As New StateObject state.workSocket = client ' Begin receiving the data from the remote device. client.BeginReceive(state.buffer,New AsyncCallback(AddressOf ReceiveCallback),state) End Sub 'Receive Private Shared Sub ReceiveCallback(ByVal ar As IAsyncResult) ' Retrieve the state object and the client socket ' from the asynchronous state object. Dim state As StateObject = CType(ar.AsyncState,StateObject) Dim client As Socket = state.workSocket ' Read data from the remote device. Dim bytesRead As Integer = client.EndReceive(ar) If bytesRead > 0 Then ' There might be more data,bytesRead)) ' Get the rest of the data. client.BeginReceive(state.buffer,state) Else ' All the data has arrived; put it in response. If state.sb.Length > 1 Then response = state.sb.ToString() End If ' Signal that all bytes have been received. receiveDone.Set() End If End Sub 'ReceiveCallback Private Shared Sub Send(ByVal client As Socket,ByVal data As String) ' Convert the string data to byte data using ASCII encoding. Dim byteData As Byte() = Encoding.ASCII.GetBytes(data) ' Begin sending the data to the remote device. client.BeginSend(byteData,client) End Sub 'Send Private Shared Sub SendCallback(ByVal ar As IAsyncResult) ' Retrieve the socket from the state object. Dim client As Socket = CType(ar.AsyncState,Socket) ' Complete sending the data to the remote device. Dim bytesSent As Integer = client.EndSend(ar) Console.WriteLine("Sent {0} bytes to server.",bytesSent) ' Signal that all bytes have been sent. sendDone.Set() End Sub 'SendCallback End Class 'AsynchronousClient

例程创建了客户端到服务器端的连接,客户端的连接是通过异步socket方式实现。 通过上面的程序相信大家对VB.NET中Net.Sockets类有了基本的了解。

猜你在找的VB相关文章