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
No se mucho de VB.net pero debe de haber implementaciones de websockets en VB.net. Si quieres que VB.net corra JS en google chrome lo único que se me ocurre es que hagas un archivo .html y agregues el codigo ahí y que corras google chrome desde VB.net para abrir el archivo .html.
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..
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
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
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 (https://stackoverflow.com/questions/24721957/websocket-server-client-server-frame-mask)
Gracias de antemano