job_2006ID:job_2006
832次访问,排名2万外好友3人,关注者6
job_2006的文章
原创 0 篇
翻译 0 篇
转载 26 篇
评论 1 篇
最近评论
xfblue:代码挺好用,用你的登录代码解决了登录问题,发现网上的文章都是说了一堆废话,让人摸不到头脑,原来实现如此简单...
文章分类
收藏
    相册
    博客园
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 基于.Net3.5编写,全异步操作。支持TCP、UDP两种方式,全事件模式通知。收藏

    新一篇:  GridView导出到Excel或Word文件 | 旧一篇: C# ,webBrowser,登录,数据填充,模拟点击链接,运行JS函数

    '**********************************************************************
    '
                    适用于 .Net3.5版本
    '
    **********************************************************************


    Imports System.Net.Sockets
    Imports System.Net
    Imports System.Collections.Generic
    Imports System.Linq

    Public Class Socket35

    #Region "自定义Socket结构体"
        
    Public Class MySocket
            
    Private MyWorkSocket As Socket
            
    Private MyWorkID As Int32
            
    Private MyWorkName As String

            
    ''' <summary>
            ''' 设置工作Socket
            ''' </summary>
            ''' <value>Scoket对象</value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property WorkSocket() As Socket
                
    Get
                    
    Return MyWorkSocket
                
    End Get
                
    Set(ByVal value As Socket)
                    MyWorkSocket 
    = value
                
    End Set
            
    End Property


            
    ''' <summary>
            ''' Socket工作ID
            ''' </summary>
            ''' <value>Integer值</value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property WorkID() As Int32
                
    Get
                    
    Return MyWorkID
                
    End Get
                
    Set(ByVal value As Int32)
                    MyWorkID 
    = value
                
    End Set
            
    End Property


            
    ''' <summary>
            ''' Socket工作名称
            ''' </summary>
            ''' <value>String值</value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property WorkName() As String
                
    Get
                    
    Return MyWorkName
                
    End Get
                
    Set(ByVal value As String)
                    MyWorkName 
    = value
                
    End Set
            
    End Property

        
    End Class

    #End Region


    #Region "Socket协义类型"
        
    Public Enum SocketType
            TCP
            UDP
        
    End Enum

    #End Region


        
    Private SocketID As Int32
        
    Private Server As Socket
        
    Private ServerHas As New HashSet(Of MySocket)
        
    Private MyReceiveBuff(), MySendBuff() As Byte
        
    Public Delegate Sub EventHandler(ByRef Sender As MySocket, ByVal e As SocketAsyncEventArgs)

        
    '-------------------------------------------------------------------------------------------------------------

        
    Public Event OnAccept As EventHandler '客户端连接事件
        Public Event OnReceive As EventHandler '客户端传入数据事件
        Public Event OnDisconnected As EventHandler  '客户端断开事件
        Public Event OnSent As EventHandler  '数据发送完毕


        
    '**********************************************************************
        '      Socket对象定义、接收数据、发送数据、外部事件引发
        '**********************************************************************

    #Region "构造函数"
        
    ''' <summary>
        ''' 初始化Socket35
        ''' </summary>
        ''' <param name="ProtocolType">协议类型</param>
        ''' <remarks></remarks>
        Sub New(ByVal ProtocolType As SocketType)
            
    '复位SocketID值
            SocketID = 1

            
    Select Case ProtocolType
                
    Case SocketType.TCP
                    Server 
    = New Socket(AddressFamily.InterNetwork, Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)
                
    Case SocketType.UDP
                    Server 
    = New Socket(AddressFamily.InterNetwork, Sockets.SocketType.Dgram, Sockets.ProtocolType.Udp)
            
    End Select
        
    End Sub


        
    ''' <summary>
        ''' 初始化Socket35
        ''' </summary>
        ''' <param name="ProtocolType">协议类型</param>
        ''' <param name="ReceiveBuffLength">接收缓冲区长度</param>
        ''' <param name="SendBuffLength">发送缓冲区长度</param>
        ''' <remarks></remarks>
        Sub New(ByVal ProtocolType As SocketType, ByVal ReceiveBuffLength As Int32, ByVal SendBuffLength As Int32)
            
    '复位SocketID值
            SocketID = 1

            
    If ReceiveBuffLength < 1 OrElse SendBuffLength < 1 Then
                
    Throw New Exception("缓冲区大小必须大于0"New OverflowException)
                
    Exit Sub
            
    End If

            
    Select Case ProtocolType
                
    Case SocketType.TCP
                    Server 
    = New Socket(AddressFamily.InterNetwork, Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)
                
    Case SocketType.UDP
                    Server 
    = New Socket(AddressFamily.InterNetwork, Sockets.SocketType.Dgram, Sockets.ProtocolType.Udp)
            
    End Select

            ReceiveBuff 
    = ReceiveBuffLength
            SendBuff 
    = SendBuffLength
        
    End Sub

    #End Region


    #Region "连接服务器"
        
    ''' <summary>
        ''' 连接到服务器端
        ''' </summary>
        ''' <param name="Ip">IP地址</param>
        ''' <param name="Port">端口</param>
        ''' <returns>MySocket对象</returns>
        ''' <remarks></remarks>
        Public Function Connect(ByVal Ip As StringByVal Port As Int32) As MySocket
            
    Dim MS As New MySocket

            
    '复位SocketID值
            SocketID = 1

            Server.Connect(Ip, Port)
            MS.WorkID 
    = SocketID
            MS.WorkSocket 
    = Server
            ServerHas.Add(MS)

            
    Return MS
        
    End Function


        
    ''' <summary>
        ''' 连接到服务器端
        ''' </summary>
        ''' <param name="RemotoEndPoint">远程服务器节点</param>
        ''' <returns>MySocket对象</returns>
        ''' <remarks></remarks>
        Public Function Connect(ByVal RemotoEndPoint As IPEndPoint) As MySocket
            
    Dim MS As New MySocket

            
    '复位SocketID值
            SocketID = 1

            Server.Connect(RemotoEndPoint)
            MS.WorkID 
    = SocketID
            MS.WorkSocket 
    = Server
            ServerHas.Add(MS)

            
    Return MS
        
    End Function

    #End Region


    #Region "接收缓冲区大小"
        
    ''' <summary>
        ''' 读取或设置接收缓冲区大小
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ReceiveBuff() As Int32
            
    Get
                
    Return MyReceiveBuff.Length
            
    End Get
            
    Set(ByVal value As Int32)
                
    ReDim MyReceiveBuff(value)
            
    End Set
        
    End Property

    #End Region


    #Region "发送缓冲区大小"
        
    ''' <summary>
        ''' 读取或设置发送缓冲区大小
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property SendBuff() As Int32
            
    Get
                
    Return MySendBuff.Length
            
    End Get
            
    Set(ByVal value As Int32)
                
    ReDim MySendBuff(value)
            
    End Set
        
    End Property

    #End Region


    #Region "绑定地址和端口"
        
    ''' <summary>
        ''' 绑定地址和端口
        ''' </summary>
        ''' <param name="Ip">Ip地址</param>
        ''' <param name="Port">端口</param>
        ''' <remarks></remarks>
        Public Overloads Sub Bind(ByVal Ip As StringByVal Port As Int32)

            Server.Bind(
    New IPEndPoint(IPAddress.Parse(Ip), Port))
        
    End Sub


        
    ''' <summary>
        ''' 绑定地址和端口
        ''' </summary>
        ''' <param name="IpEndPoint">Ip地址和端口的节点</param>
        ''' <remarks></remarks>
        Public Overloads Sub Bind(ByVal IpEndPoint As IPEndPoint)

            Server.Bind(IpEndPoint)
        
    End Sub

    #End Region


    #Region "侦听数"
        
    ''' <summary>
        ''' 设置侦听数
        ''' </summary>
        ''' <param name="val">侦听数</param>
        ''' <remarks></remarks>
        Public Sub Listen(ByVal val As Int32)
            Server.Listen(
    val)
        
    End Sub

    #End Region


    #Region "开始侦听"
        
    ''' <summary>
        ''' 开始侦听客户端连接
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Start()
            
    Select Case Server.ProtocolType
                
    Case ProtocolType.Tcp
                    StartForTcp()
                
    Case ProtocolType.Udp
                    StartForUdp()
            
    End Select
        
    End Sub


        
    Private Sub StartForTcp()
            
    Dim acc As New SocketAsyncEventArgs

            
    AddHandler acc.Completed, AddressOf Accept_Completed
            Server.AcceptAsync(acc)
        
    End Sub


        
    Private Sub StartForUdp()
            
    Dim acc As New SocketAsyncEventArgs

            
    AddHandler acc.Completed, AddressOf UDP_Receive_Completed
            acc.RemoteEndPoint 
    = Server.LocalEndPoint
            acc.SetBuffer(MyReceiveBuff, 
    0, MyReceiveBuff.Length)
            Server.ReceiveFromAsync(acc)
        
    End Sub

    #End Region


    #Region "客户端连接"
        
    Private Sub Accept_Completed(ByVal Sender As ObjectByVal e As SocketAsyncEventArgs)
            
    '事件进入
            Dim MS As New MySocket
            
    Dim Client As Socket

            Client 
    = e.AcceptSocket
            MS.WorkID 
    = SocketID
            MS.WorkSocket 
    = Client

            
    RaiseEvent OnAccept(MS, e)

            
    If IsNothing(Client) OrElse Not Client.Connected Then
                
    If Not IsNothing(ServerHas) Then
                    ServerHas.Remove(MS)
                
    End If

                
    Exit Sub
            
    Else
                ServerHas.Add(MS)
            
    End If

            
    '接收数据
            RemoveHandler e.Completed, AddressOf Accept_Completed
            
    AddHandler e.Completed, AddressOf TCP_Receive_Completed
            e.SetBuffer(MyReceiveBuff, 
    0, MyReceiveBuff.Length)
            Client.ReceiveAsync(e)
            SocketID 
    += 1
            Start()
        
    End Sub