-
VB.NET环境下的Socket异步编程举例
下面的程序分别分服务器和客户端两部分:
转自 http://track.cnblogs.com/archive/2005/09/26/244673.aspx
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, 0, StateObject.BufferSize, 0, 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, 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 |
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, SocketType.Stream, 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, 0, StateObject.BufferSize, 0, 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, so store the data received so far. state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)) ' Get the rest of the data. client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallback), 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, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), 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 |
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式