VB.NET Socket編程實(shí)際操作方法介紹
VB.NET 應(yīng)用范圍非常廣泛。我們可以在VB.NET環(huán)境中進(jìn)行一些特定語(yǔ)言的編寫。下面就來(lái)看一下VB.NET Socket編程的相關(guān)方法。一直以來(lái)很想學(xué)習(xí)Socket編程方面的應(yīng)用,比如怎樣通過(guò)Socket編程實(shí)現(xiàn)單片機(jī)與PC的TCP連接通信。在單片機(jī)嵌入網(wǎng)卡芯片與PC進(jìn)行連接通信,實(shí)現(xiàn)PC的web方式對(duì)單片機(jī)所控制的設(shè)備的狀態(tài)管理,例如智能家居方面的應(yīng)用。#t#
下面通過(guò)例子來(lái)學(xué)習(xí)VB.NET Socket編程類的應(yīng)用,下面的程序是服務(wù)器中的代碼實(shí)現(xiàn):
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 AsynchronousSocket
Listener - ' Thread signal.
- Public Shared allDone As New Manual
ResetEvent(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, 0, StateObject.
BufferSize, 0, New AsyncCallback(AddressOf
ReadCallback), state) - End Sub 'AcceptCallback
- Public Shared Sub ReadCallback(ByVal ar As
IAsyncResult) - Dim content As StringString = 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, 0, 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, 0, StateObject.
BufferSize, 0, New AsyncCallback(AddressOf
ReadCallback), 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, 0, byteData.Length, 0,
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
VB.NET Socket編程的具體用法就為大家介紹到這里。