将WebSocket客户端数据读取到服务器vb.net

问题描述 投票:1回答:1

下午好。我澄清一下,我对WebSockets不太了解,但是我正在学习它。我正在尝试使用WebSocket在vb.net(服务器)和浏览器(客户端)之间建立连接。在Internet上搜索,我可以使其工作(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

websocket vb.net-2010
1个回答
0
投票

我看到这个问题有点老了,尽管是一个重要问题,但尚未得到任何答案。

这里有2页(同一项目)有关TCP / IP套接字读写。

客户端示例:http://vb.net-informations.com/communications/vb.net_Client_Socket.htm

服务器端示例:http://vb.net-informations.com/communications/vb.net_Server_Socket.htm

完成此操作后,您可以转到那里的线程示例(聊天服务器和多线程多客户端TCP / IP套接字服务器),以进行更高级的通信处理。

我知道这个答案并不完美,我鼓励any1对其进行编辑和改进,但是我确信它比当前状态要好(根本没有帮助)。

祝一切顺利!

© www.soinside.com 2019 - 2024. All rights reserved.