Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Kmiiik

#1
Buscando en internet sobre lo que quería hacer, pude encontrar información de websocket y vb.net para comunicarme con el navegador. Con ello pude lograr hacer una comunicación entre vb.net y el navegador mediante WebSocket. Desde mi servidor vb.net puedo enviar mensajes al cliente en el navegador y recibirlos perfectamente, pero no sé como recibir el mensaje que me envía el cliente. Estuve buscando sobre eso, y encontré un pregunta similar en stackoverflow, y el que hizo la pregunta pudo solucionar su problema (comentó la solución) pero no entiendo bien como implementar su código.. Alguien podría ayudarme?


SERVER VB.NET
Código (vbnet) [Seleccionar]
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



Client
Código (javascript) [Seleccionar]
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');
  };




Respuesta para leer mensajes del cliente en el servidor (es lo que no entiendo)
https://stackoverflow.com/questions/24721957/websocket-server-client-server-frame-mask


Gracias de antemano
#2
He intentado mediante selenium. Pero la pagina donde lo intento hacer detecta cualquiera de esos programas, al igual que phantomJS y similares :c Lo que quiero es que pueda funcionar directamente con el navegador que se usa, no con una modificación de alguno como en el caso de selenium o similar.. no sé si sea posible, por websocket he buscado ejemplos con vb.net para conectarse a WEB, pero solo hay de ASP.. algo que no es lo que busco

EDIT

Encontré en internet información sobre WebSocket en vb.net. Puedo enviar mensajes desde el servidor VB.NET al cliente (navegador). Pero no sé bien como recibirlos..
#3
Buenas noches. Me gustaría que me pudieran orientar con información sobre como se podría enviar JS desde un programa hecho en VB.NET (winform) al navegador (Google Chrome, firefox, o el que sea). Actualmente hago algo similar usando un control WebBrowser (GeckoFX) en mi formulario, para cargar la pagina en el control y ejecutar JS dentro, lo cual funciona todo bien.. pero me gustaría saber como se podría hacer sin depender de un control incrustado en el programa.

Lo más cercano a la pregunta que hago sería algo igual al funcionamiento en SOCKET.IO con NODEJS, donde puedo hacer que se ejecute JS en el cliente solo con enviar un comando desde el servidor. Pues algo similar quisiera saber si se puede hacer con VB.NET en un navegador, sea que pueda usar una extensión de google como intermediario para ejecutar JS o si conocen alguna manera de hacer algo similar.. gracias