zoukankan      html  css  js  c++  java
  • MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子  

    2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号 订阅

     
     

    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.Threading


    ' 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

        ' Incoming data from the client.
        Public Shared data As String = Nothing

        ' Thread signal.
        Public Shared allDone As New ManualResetEvent(False)


        Public Sub New()


        End Sub 'New


        Public Shared Sub StartListening()
            ' Data buffer for incoming data.
            Dim bytes() As Byte = New [Byte](1024) {}

            ' Establish the local endpoint for the socket.
            ' The DNS name of the computer
            ' running the listener is "host.contoso.com".
            Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName())
            Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)
            Dim localEndPoint As New IPEndPoint(ipAddress, 11000)

            ' Intializes 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.

            Try
                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 before continuing.
                    allDone.WaitOne()
                End While

            Catch e As Exception
                Console.WriteLine(e.ToString())
            End Try

            Console.WriteLine(ControlChars.Cr + "Press ENTER to continue...")
            Console.Read()
        End Sub 'StartListening


        Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult)
            ' Signal the main thread to continue.
            allDone.Set()

            ' Get the socket that handles the client request.
            Dim listener As Socket = CType(ar.AsyncState, Socket)
            Dim handler As Socket = listener.EndAccept(ar)

            ' Create the state object.
            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 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. " + _
                        ControlChars.Cr + " 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)
            Try
                ' 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()

            Catch e As Exception
                Console.WriteLine(e.ToString())
            End Try
        End Sub
    'SendCallback

        'Entry point that delegates to C-style main Private Function.
        Public Overloads Shared Sub Main()
            System.Environment.ExitCode = _
            Main(System.Environment.GetCommandLineArgs())
        End Sub

        Public Overloads Shared Function Main(ByVal args() As [String]) As Integer
            StartListening()
            Return 0
        End Function 'Main
    End Class 'AsynchronousSocketListener

  • 相关阅读:
    Sql Server 中的 @@ERROR
    MVC 自定义HtmlHelper帮助类型之分页
    CI(CodeIgniter)框架中的增删改查操作
    WMAP 启动报错 PHP- 提示缺少 msvcr110.dll 的问题
    Bat命令学习 (转载)
    C# 实现刻录光盘功能
    几个操作、名词的说明
    CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别?
    关于设置Visaul Studio 2010 代码编辑界面背景的方法
    checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同
  • 原文地址:https://www.cnblogs.com/shuenjian901/p/3517328.html
Copyright © 2011-2022 走看看