VB.net与VB6 调用Websocket功能的方法--Websocket For VB

概述

       Websocket 功能在现今的通信应用开发中越来越普遍,因为Websocket的消息机制,在应用程序进行即时通信时使用非常合适,而且Websocket 是长连接方式,比起以前的http协议,性能也优越很多。很多旧的VB程序(包含VB.Net与VB6)希望升级一下通信方式以便跟上潮流,但VB并没有现成的Websocket组件可用。基于这种情况,笔者自己实现了一个Websocket组件,用于VB环境,程序目前已经运行好几年了,还是非常稳定的,性能也非常不错。并且支持Websocket的TLS方式通信,实现了Websocket的全部功能,现介绍一下如何使用。

组件名称:

VBToolsLib.Websocket,

技术特点

  • 1采用C/C++开发实现的Com组件
  • 2、采用异步I/O调用与多线程开发,性能高
  • 3、原生支持x86与x64版本
  • 4、支持任何开发环境调用,包含VB、VB.Net、C#、VC等
  • 5、全面支持 WS与WSS协议
  • 6、完全免费,永久免费,没有任何功能限制
  • 7、除了依赖Openssl库,无其它依赖,VB程序打包重新发布方便简单
  • 8、支持setHttpHeader自定义http请求头

VB调用方法

1、在github里下载这个组件:

https://github.com/wenshui2008/WebsocketVB

2、调用Regsvr32程序来注册这个COM组件

# 64位环境  建议注册2种版本,则支持原生x86与x64程序

regsvr32  <pathToDll>\x86\VBTools.dll
regsvr32  <pathToDll>\x64\VBTools.dll

#32位环境,只能注册32位版本
regsvr32  <pathToDll>\x86\VBTools.dll

3、参考 适用于C#,VB.net与VB6 的开发使用

4、调用代码 

VB.Net方式
1)在Form的Load事件创建组件,并设置主窗口句柄,调用setwindowhandle64来设置窗口句柄,setwindowhandle为32位版本
2)在Form的Close事件里,注销与窗口句柄的关联,这步不是必须
3)实现接收组件的事件回调方法,websock_onopen、websock_onmessage、websock_onclose与websock_onerror等事件,
4)调用send发送消息,调用close关闭连接
 

Public Class mainForm
    Dim WithEvents websock As VBToolsLib.Websocket

    Delegate Sub appendText(s As String)
    Dim useSetwindowhandle As Boolean = False


    Private Sub mainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim count As Integer

        'TextBox.CheckForIllegalCrossThreadCalls = False
        '在窗口的初始化事件里创建Websocket对象
        websock = New VBToolsLib.Websocket

        '接着关联一个主线程窗口句柄便于接收Websocket消息
        'setwindowhandle方法用于设置关联窗口句柄(仅用于32位版本),setwindowhandle64为64位版本
        '仅需要调用这两个方法中的一个即可,64位版本必须用setwindowhandle64方法
        'websock.setwindowhandle(Me.Handle)
        'setwindowhandle64 即能够用于Windows 32位又能用于64位
        websock.setwindowhandle64(Me.Handle)
        '因为调用了setwindowhandle64方法,所以设置标志为True
        useSetwindowhandle = True
        '任何时间都可以调用bufferedAmount属性获取尚未发送的缓冲数目,这里仅是演示
        count = websock.bufferedAmount
		'在调用open 方法之前可以设置Http 请求头,这些头放在标准的HTTP协议请求头里发送给服务器
        websock.setHttpHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36")
        websock.setHttpHeader("Cookie", "XMPlayer=V1.0; PHPSESSID=3nm364h6bu2i80lp4esik5ki56")

        urlInput.Text = "wss://192.168.2.134:3000/"

        If (IntPtr.Size = 8) Then
            Me.Text &= " (x64)"
        End If
    End Sub

    Private Sub mainForm_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        '在窗口关闭事件里取消窗口句柄关联,不是必须
        If useSetwindowhandle Then
            websock.setwindowhandle(0)
        End If
    End Sub

    Private Sub OpenBtn_Click(sender As System.Object, e As System.EventArgs) Handles OpenBtn.Click
        Dim url
        url = urlInput.Text

        If url <> "" Then
            '连接服务器,执行的是异步操作,只能通过监听onopen与onerror事件来判断是否成功
            websock.open(url)
        End If
    End Sub

    Private Sub CloseBtn_Click(sender As System.Object, e As System.EventArgs) Handles CloseBtn.Click
        websock.close()
    End Sub

    Private Sub SendBtn_Click(sender As System.Object, e As System.EventArgs) Handles SendBtn.Click
        Dim sMsg As String = msgInputBox.Text

        If sMsg <> "" Then
            websock.send(sMsg)
        End If
    End Sub

    Private Sub websock_onopen() Handles websock.onopen
        Dim sTime As String = DateDiff("s", "1970-01-01 00:00:00", Now)
        Dim sMsg = ""
        websock.send("login: " & sTime)

        sMsg = "OnOpen" & Chr(13) & Chr(10)
        If useSetwindowhandle Then
            msgListbox.AppendText(sMsg)
        Else
            '如果没有调用setwindowhandle关联窗体句柄,就必须用委托方式,否则可能会有多线程界面死锁问题
            Me.Invoke(New appendText(AddressOf AppendTextMethod), sMsg)
        End If
    End Sub

    Private Sub websock_onmessage(ByVal msg As String) Handles websock.onmessage
        Dim sMsg As String

        sMsg = msg & Chr(13) & Chr(10)
        If useSetwindowhandle Then
            msgListbox.AppendText(sMsg)
        Else
            '如果没有调用setwindowhandle(x64),就必须用委托方式,否则会有多线程界面死锁问题
            Me.Invoke(New appendText(AddressOf AppendTextMethod), sMsg)
        End If

        '这里演示处理消息,具体业务逻辑的实现可能不是这样的,这里仅为演示
        If (msg = "[MSG]:close") Then
            websock.close()
        ElseIf (msg.Substring(0, 14) = "[MSG]:foreward") Then
            Dim newmsg = msg.Substring(14)
            '演示将消息重新转发出去,具体业务逻辑由调用者自己实现,这里仅仅为演示
            websock.send("[MSG]:This is a foreward MSG:" & newmsg)
        End If
    End Sub

    Private Sub websock_onclose() Handles websock.onclose
        Dim sMsg As String
        sMsg = "Onclose" & Chr(13) & Chr(10)
        If useSetwindowhandle Then
            msgListbox.AppendText(sMsg)
        Else
            '没有调用setwindowhandle(x64),就必须用委托方式,否则有多线程问题
            Me.Invoke(New appendText(AddressOf AppendTextMethod), sMsg)
        End If
    End Sub

    Private Sub websock_onerror(ByVal msg As String) Handles websock.onerror
        Dim sMsg As String

        sMsg = "onerror:" & msg & Chr(13) & Chr(10)
        If useSetwindowhandle Then
            msgListbox.AppendText(sMsg)
        Else
            '调用了 setwindowhandle(x64) 就不用委托方式了,否则会有多线程问题
            Me.Invoke(New appendText(AddressOf AppendTextMethod), sMsg)
        End If
    End Sub

    Public Sub AppendTextMethod(msgText As String)
        msgListbox.AppendText(msgText)
    End Sub
End Class


界面如下:

在这里插入图片描述

最后:Demo程序的全部源代码与组件的发布版在这:
https://github.com/wenshui2008/WebsocketVB

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HTML 5 Web Sockets is a powerful and effective technique for real-time information processing. There exists many techniques such as Poling, Long Poling and Streaming that are said to be better earier days. With web sockets, it shows a better outcome for the end user as well as a proper utilization of the server bandwidth. WebSocket is a web technology providing full-duplex communications channels over a single TCP connection. The WebSocket protocol was standardized by the IETF as RFC 6455 in 2011, and the WebSocket API for in Web IDL is being standardized by the W3C.WebSocket is designed to be implemented in web browsers and web servers, but it can be used by any client or server application. The WebSocket Protocol is an independent TCP-based protocol. Its only relationship to HTTP is that its handshake is interpreted by HTTP servers as an Upgrade request. The WebSocket protocol makes possible more interaction between a browser and a web site, facilitating live content and the creation of real-time games. This is made possible by providing a standardized way for the server to send content to the browser without being solicited by the client, and allowing for messages to be passed back and forth while keeping the connection open. In this way a two-way (bi-directional) ongoing conversation can take place between a browser and the server. A similar effect has been achieved in non-standardized ways using stop-gap technologies such as Comet.In addition, the communications are done over TCP port number 80, which is of benefit for those environments which block non-standard Internet connections using a firewall. WebSocket protocol is currently supported in several browsers including Google Chrome, Internet Explorer, Firefox, Safari and Opera. WebSocket also requires web applications on the server to support it. Here goes a comparison of polling vs Web Sockets.
### 回答1: 在VB.NET中创建WebSocket服务器,您需要使用System.Net命名空间中的WebSocket和HttpListener类。下面是一个简单的示例代码: ```vb Imports System.Net Imports System.Net.WebSockets Imports System.Text Imports System.Threading Public Class WebSocketServer Private listener As HttpListener Private webSocketContext As HttpListenerContext Private webSocket As HttpListenerWebSocketContext Private webSocketHandlerThread As Thread Public Sub Start() listener = New HttpListener() listener.Prefixes.Add("http://localhost:8080/") ' 设置监听的地址和端口号 listener.Start() Console.WriteLine("WebSocket server started!") While True webSocketContext = listener.GetContext() webSocket = webSocketContext.AcceptWebSocketAsync(Nothing).Result If webSocket.WebSocket.State = WebSocketState.Open Then Console.WriteLine("WebSocket connection established!") webSocketHandlerThread = New Thread(AddressOf HandleWebSocket) webSocketHandlerThread.Start() End If End While End Sub Private Sub HandleWebSocket() Dim buffer(1024) As Byte Dim result As WebSocketReceiveResult While webSocket.WebSocket.State = WebSocketState.Open result = webSocket.WebSocket.ReceiveAsync(New ArraySegment(Of Byte)(buffer), CancellationToken.None).Result If result.CloseStatus.HasValue Then Console.WriteLine("WebSocket connection closed!") webSocket.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None).Wait() Exit While End If Dim message As String = Encoding.UTF8.GetString(buffer, 0, result.Count) Console.WriteLine("Received message: " & message) ' 在此进行逻辑处理,例如向客户端发送消息 Dim responseMessage As String = "Hello from server!" Dim responseBytes As Byte() = Encoding.UTF8.GetBytes(responseMessage) webSocket.WebSocket.SendAsync(New ArraySegment(Of Byte)(responseBytes), WebSocketMessageType.Text, True, CancellationToken.None).Wait() End While End Sub Public Sub [Stop]() If listener IsNot Nothing AndAlso listener.IsListening Then webSocketHandlerThread.Join() listener.Stop() Console.WriteLine("WebSocket server stopped!") End If End Sub End Class Public Class Program Public Shared Sub Main(ByVal args As String()) Dim server As New WebSocketServer() server.Start() ' 执行其他操作或等待终止服务器 Console.WriteLine("Press any key to stop the server...") Console.ReadKey(True) server.Stop() End Sub End Class ``` 以上代码示例展示了如何创建一个简单的WebSocket服务器,并实现了基本的消息交换。您可以根据自己的需求对服务器进行进一步的扩展和调整。请注意,此示例仅适用于单个连接,如果需要处理多个连接,您需要使用线程或异步操作来处理每个连接。 请确保在使用此代码前安装并导入System.Net命名空间。另外,请根据您的实际需求设置适当的地址和端口号。 ### 回答2: VB.NET WebSocket 服务端是一种可以通过 WebSocket 协议与客户端进行实时双向通信的服务器端应用程序。它提供了一种高效、可扩展的方式来实现实时数据传输。 VB.NET WebSocket 服务端是基于 WebSocket 技术实现的,它通过建立持久化连接,在服务器和客户端之间传输数据,而无需频繁的建立和关闭连接。这种双向通信模式使得服务端可以主动向客户端发送消息,并实时接收来自客户端的数据。 VB.NET WebSocket 服务端的搭建相对简单。首先,我们需要引用 System.Net 和 System.Net.WebSockets 的命名空间,来使用相应的类和方法。然后,我们可以创建一个 WebSocketListener 对象,用于监听客户端的连接请求。通过调用该对象的 Start 方法,可以开始监听,并接受客户端的连接。 一旦客户端连接成功,我们可以在服务端创建一个 WebSocketContext 对象,用于处理具体的会话。通过该对象,服务端可以获取客户端的 IP 地址、请求头信息等。然后,我们可以使用 WebSocketContext 对象的 WebSocket 属性来与客户端进行通信。 在与客户端进行通信时,我们可以使用 SendAsync 方法向客户端发送消息,也可以使用 ReceiveAsync 方法接收来自客户端的消息。当服务端收到客户端发送的消息时,可以根据具体需求做出相应的处理,也可以发送其他消息给客户端。 当连接结束或出现异常时,我们需要调用 CloseAsync 方法来关闭连接,并释放相关资源。同时,我们也可以使用 CancellationToken 来实现异步取消操作。 总之,VB.NET WebSocket 服务端提供了一种灵活、高效、可靠的实时数据传输方式。它可以广泛应用于实时通信、在线游戏、实时数据监控等领域,为开发人员提供了更多创新和丰富的应用场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值