首页 > 解决方案 > 读取 WebSocket 客户端数据到服务器 vb.net

问题描述

下午好。我澄清说我对 WebSockets 了解不多,但我正在学习它。我正在尝试使用 WebSocket 在 vb.net(服务器)和浏览器(客户端)之间建立连接。在互联网上搜索我可以完成这项工作(Websocket Server VB.NET - Data Frame)目前我可以从 vb.net 向浏览器发送消息,但我不知道如何读取客户端发送到服务器的消息..我找到了一个关于它的代码,但我不太明白如何将它实现到我的代码中(WebSocket Server, client -> server frame mask

客户

function connect(host) {
  var ws = new WebSocket(host);
  ws.onopen = function () {
    console('connected');
    //ws.send("test");
  };

  ws.onmessage = function (evt) {  
    console('reveived data:'+evt.data);
  };

  ws.onclose = function () {
    console('socket closed');
  };

服务器

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

Public Class Form1
    Dim serverTcp As TcpListener
    Dim serverThread As Thread
    Dim host_ As String = ""
    Dim curSocket As Socket
    Sub Main()
        '' Start server
        serverThread = New Thread(AddressOf serverProc)
        serverThread.Start()
    End Sub

    Private Sub serverProc()
        Try
            '' Listen to port 5665
            serverTcp = New TcpListener(System.Net.IPAddress.Parse(host_), 5665)
            serverTcp.Start()

            Console.WriteLine("Listen to port 5665 ...")

            '' Accept any connection
            While (True)
                curSocket = serverTcp.AcceptSocket()
                Dim thread As New Thread(AddressOf clientProc)
                thread.Start(curSocket)
            End While
        Catch ex As Exception

        End Try

    End Sub

    Private Sub clientProc(ByVal sck As Socket)
        Try
            Dim netStream As New NetworkStream(sck)
            Dim netReader As New IO.StreamReader(netStream)
            Dim netWriter As New IO.StreamWriter(netStream)

            Dim key As String = ""

            Console.WriteLine("Accept new connection ...")

            '' Reading handshake message
            While (True)
                Dim line As String = netReader.ReadLine()
                If line.Length = 0 Then
                    Exit While
                End If

                If (line.StartsWith("Sec-WebSocket-Key: ")) Then
                    key = line.Split(":")(1).Trim()
                End If

                Console.WriteLine("Data: " & line)

            End While

            '' Calculate accept-key
            key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
            key = getSHA1Hash(key)

            '' Response handshake message
            Dim response As String
            response = "HTTP/1.1 101 Switching Protocols" & vbCrLf
            response &= "Upgrade: websocket" & vbCrLf
            response &= "Connection: Upgrade" & vbCrLf
            response &= "Sec-WebSocket-Accept: " & key & vbCrLf & vbCrLf
            netWriter.Write(response)
            netWriter.Flush()

            '' Sending message
            SendMessage(sck, "SEND.. VB.NET")
        Catch ex As Exception

        End Try

    End Sub
    Sub Msg(t As String)
        Console.WriteLine(t)
    End Sub
    Function getSHA1Hash(ByVal strToHash As String) As String
        Dim sha1Obj As New System.Security.Cryptography.SHA1CryptoServiceProvider
        Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)
        Dim result As String

        bytesToHash = sha1Obj.ComputeHash(bytesToHash)
        result = Convert.ToBase64String(bytesToHash)

        Return result
    End Function

    Sub SendMessage(sck As Socket, message As String)
        Dim rawData = System.Text.Encoding.UTF8.GetBytes(message)

        Dim frameCount = 0
        Dim frame(10) As Byte

        frame(0) = CByte(129)

        If rawData.Length <= 125 Then
            frame(1) = CByte(rawData.Length)
            frameCount = 2
        ElseIf rawData.Length >= 126 AndAlso rawData.Length <= 65535 Then
            frame(1) = CByte(126)
            Dim len = CByte(rawData.Length)
            frame(2) = CByte(((len >> 8) & CByte(255)))
            frame(3) = CByte((len & CByte(255)))
            frameCount = 4
        Else
            frame(1) = CByte(127)
            Dim len = CByte(rawData.Length)
            frame(2) = CByte(((len >> 56) & CByte(255)))
            frame(3) = CByte(((len >> 48) & CByte(255)))
            frame(4) = CByte(((len >> 40) & CByte(255)))
            frame(5) = CByte(((len >> 32) & CByte(255)))
            frame(6) = CByte(((len >> 24) & CByte(255)))
            frame(7) = CByte(((len >> 16) & CByte(255)))
            frame(8) = CByte(((len >> 8) & CByte(255)))
            frame(9) = CByte((len & CByte(255)))
            frameCount = 10
        End If

        Dim bLength = frameCount + rawData.Length
        Console.WriteLine(frameCount)
        Console.WriteLine(rawData.Length)
        Dim reply(bLength + 1) As Byte

        Dim bLim = 0
        For i = 0 To frameCount - 1
            Console.WriteLine(bLim)
            reply(bLim) = frame(i)
            bLim += 1
        Next

        For i = 0 To rawData.Length - 1
            Console.WriteLine(bLim)
            reply(bLim) = rawData(i)
            bLim += 1
        Next

        sck.Send(reply)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        host_ = Dns.GetHostEntry(Dns.GetHostName()).AddressList _
    .Where(Function(a As IPAddress) Not a.IsIPv6LinkLocal AndAlso Not a.IsIPv6Multicast AndAlso Not a.IsIPv6SiteLocal) _
    .Last() _
    .ToString()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Main()
    End Sub

    Private Sub btnEnviarMensaje_Click(sender As Object, e As EventArgs) Handles btnEnviarMensaje.Click
        SendMessage(curSocket, txtMensaje.Text)
    End Sub

End Class

标签: websocketvb.net-2010

解决方案


如果您想在您的 vb.net 项目中实现这一点很简单,您必须将此代码放在项目中的任何位置以调用您也可以将其用作“clientProc”私有子,或者如果您也可以将此代码插入 button1 对象中握手后将单击按钮,它会给您返回 Web 浏览器 websocket 客户端消息

 Dim netStream As New NetworkStream(curSocket)
        Dim bytesArray(1024) As [Byte]
        Dim byteslen As Int32
        byteslen = netStream.Read(bytesArray, 0, bytesArray.Length)

        If bytesArray.Length > 1 Then
            Msg("---------------------------------------------------")
            Msg("data type: " & bytesArray(0))

            Dim secondByte As Byte = bytesArray(1)
            Dim theLength As UInteger = secondByte And 127
            Dim indexFirstMask As Integer = 2
            If theLength = 126 Then
                indexFirstMask = 4
            ElseIf theLength = 127 Then
                indexFirstMask = 10
            End If
            Msg("indexFirstMask: " & indexFirstMask)
            Dim masks As New List(Of Byte)

            Dim x As Integer = indexFirstMask
            While (x < indexFirstMask + 4)
                masks.Add(bytesArray(x))
                x += 1
            End While

            Dim indexFirstDataByte = indexFirstMask + 4
            Dim decoded(byteslen - indexFirstDataByte) As Byte

            Dim i As Integer = 0, j As Integer = 0
            For i = indexFirstDataByte To byteslen Step 1
                Dim mask As Byte = masks(j Mod 4)
                Dim encodedByte As Byte = bytesArray(i)
                decoded(j) = (encodedByte Xor mask)
                j += 1
            Next

            Console.WriteLine("FROM CLIENT: '" & System.Text.Encoding.UTF8.GetString(decoded) & "'")
            'Console.WriteLine("temp " + decoded.ToString)
            SendMessage(curSocket, "CONNECTION_OK")
        End If


推荐阅读