转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
VB.NET编写的TCP异步通讯类(目前测试中)         ★★★★

VB.NET编写的TCP异步通讯类(目前测试中)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2024 更新时间:2009/4/23 19:00:38

这个类还没有完全OK,但基本的功能已经完成,异常还有待改进,欢迎批评。

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

<DefaultEvent("DataArrival")> Public Class MyTCPClient
    Private m_sckClient As Socket
    Private ipepRemote As IPEndPoint
    Private m_ConnDone As New ManualResetEvent(False)
    Private m_SendDone As New ManualResetEvent(False)
    Private m_ReceiveDone As New ManualResetEvent(False)

    Public Event DataArrival As DataArrivalHandler
    Public Event ConnectionComplete As EventHandler
    Public Event DisConnect As EventHandler

    Public ReadOnly Property Connected() As Boolean
        Get
            Return Me.m_sckClient.Connected
        End Get
    End Property
    Public ReadOnly Property RemoteIPEndPoint() As IPEndPoint
        Get
            Return Me.ipepRemote
        End Get
    End Property

    Public Sub New(ByVal RemotePort As Integer, ByVal RemoteIP As String, ByVal LocalPort As Integer)
        Try
            Me.SetSocket(RemotePort, RemoteIP, LocalPort)
        Catch ex As Exception
            Throw New Exception("New--" & ex.ToString)
        End Try
    End Sub

    Public Sub SetSocket(ByVal RemotePort As Integer, ByVal RemoteIP As String, ByVal LocalPort As Integer)

        Me.m_sckClient = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        ipepRemote = New IPEndPoint(IPAddress.Parse(RemoteIP), RemotePort)
        Me.m_sckClient.Blocking = False

        Me.m_sckClient.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 0)
        Me.m_sckClient.BeginConnect(Me.ipepRemote, New System.AsyncCallback(AddressOf CBConn), m_sckClient)

        If Me.m_ConnDone.WaitOne(3000, False) = False Then
            Me.m_sckClient = Nothing
            Throw New Exception("SetSocket--NoConnection,目标主机没有响应")
        End If

    End Sub

    Public Sub SendData(ByVal strSend As String)
        If Not Me.m_sckClient Is Nothing Then
            If Me.m_sckClient.Connected Then
                Dim strReady As String = Chr(1) & strSend & ComputeChecksum(strSend) & Chr(4)
                Me.m_sckClient.BeginSend(System.Text.Encoding.Default.GetBytes(strReady), 0, strReady.Length, SocketFlags.None, New System.AsyncCallback(AddressOf Me.CBSend), Me.m_sckClient)
                Me.m_SendDone.WaitOne()
            Else
                Throw New SocketException("SendData--,连接还没有打开")
            End If
        Else
            Throw New Exception("SendData--,未将对象引用设置到对象的实例")
        End If
    End Sub

    Public Sub Close()
        If Not Me.m_sckClient Is Nothing Then
            If Me.m_sckClient.Connected Then
                Me.m_sckClient.Shutdown(SocketShutdown.Both)
                Me.m_sckClient.Close()
            Else
                Throw New Exception("Close--,连接还没有打开")
            End If
        Else
            Throw New Exception("Close--,未将对象引用设置到对象的实例")
        End If
    End Sub

    Public Sub Dispose()
        If Not Me.m_sckClient Is Nothing Then
            If Me.m_sckClient.Connected Then
                Me.m_sckClient.Shutdown(SocketShutdown.Both)
                Me.m_sckClient.Close()
            End If
            Me.m_sckClient = Nothing
        End If
        If Not Me.ipepRemote Is Nothing Then
            Me.ipepRemote = Nothing
        End If
    End Sub

#Region "回调函数"
    Private Sub CBConn(ByVal ar As System.IAsyncResult)
        Dim objSocket As Socket = CType(ar.AsyncState, Socket)
        If objSocket.Connected Then
            Try
                objSocket.EndConnect(ar)
                Me.m_ConnDone.Set()
                Dim state As New sckStructure
                state.worksocket = Me.m_sckClient
                Me.m_sckClient.BeginReceiveFrom(state.buffer, 0, state.buffersize, SocketFlags.None, Me.ipepRemote, AddressOf Me.CBReceive, state)
                Me.m_ReceiveDone.WaitOne()
            Catch ex As Exception
                Throw New Exception("CBConn--HasConnected" & ex.ToString)
            End Try
            RaiseEvent ConnectionComplete(Me, New EventArgs)
        Else
            Throw New Exception("CBConn--NoConnection,目标主机没有响应")
        End If
    End Sub

    Private Sub CBSend(ByVal ar As System.IAsyncResult)
        Try
            Me.m_sckClient.EndSend(ar)
            Me.m_SendDone.Set()
        Catch ex As Exception
            Throw New Exception("CBSend--" & ex.ToString)
        End Try
    End Sub

    Private Sub CBReceive(ByVal ar As System.IAsyncResult)
        Dim bytesread As Integer
        Try
            bytesread = Me.m_sckClient.EndReceive(ar)
            Me.m_ReceiveDone.Set()
        Catch ex As SocketException
            If ex.ErrorCode = 10054 Then
                RaiseEvent DisConnect(Me, New EventArgs)
            Else
                Throw New Excepti

[1] [2]  下一页


[Web开发]VB实现客户机←→服务器(TCP/IP)编程监听代码  [常用软件]优化脱兔:突破XP TCP连接限制 脱兔,连接限制
[Delphi程序]Delphi使用VB编写的ActiveX控件全攻略  [VB.NET程序]VB6 中 使用Winsock穿越各种代理的实现(TCP协议)
[Web开发]Asp.net编写的PING工具  [其他]传递和返回数据到一个Delphi编写的UDF
[SyBase]Linux网络编程--7. TCP/IP协议  [SyBase]用PB编写WinSock TCP/IP应用程序_
[MySql]Linux TCP/IP 协议栈源码分析(一)  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台