Sto provando a implementare un server Web socket C#, ma mi dà alcuni problemi. Sto eseguendo un server web (ASP.NET) per ospitare la pagina con il javascript e il server socket Web è implementato come un'applicazione console C#.Server Websocket: la funzione onopen sulla presa Web non viene mai chiamata
Sono in grado di rilevare il tentativo di connessione dal client (chrome che esegue il javascript) e anche di recuperare l'handshake dal client. Ma il client non sembra accettare la stretta di mano che sto rinviando (la funzione onopen
sul socket Web non viene mai chiamata).
Ho letto il The Web Socket protocol e non riesco a vedere cosa sto facendo male. Heres un po 'di codice del server:
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
//read handshake from client:
Console.WriteLine("HANDSHAKING...");
char[] shake = new char[255];
streamReader.Read(shake, 0, 255);
string handshake =
"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
"Upgrade: WebSocket\r\n" +
"Connection: Upgrade\r\n" +
"WebSocket-Origin: http://localhost:8080\r\n" +
"WebSocket-Location: ws://localhost:8181\r\n" +
"\r\n";
streamWriter.Write(handshake);
streamWriter.Flush();
sto correndo al server web sulla porta 8080 e il server socket web sulla porta 8181, sia sul mio localhost.
Ho provato a inviare l'handshake in diverse codifiche (ASCII, byte e Hex) ma questo non sembra fare la differenza. La connessione non è mai completamente stabilita. Il javascript è simile al seguente:
var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
ws = new WebSocket(host);
} catch (err) {
debug(err, 'error');
}
ws.onopen = function() {
debug("connected...", 'success');
};
ws.onclose = function() {
debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
debug('response: ' + evt, 'response');
};
Sto indovinando che l'errore sta nel server di C# come cromo sta inviando le informazioni come dovrebbe, ma come detto la funzione onopen
non viene mai chiamato.
Quindi la mia domanda in breve: ha qualsiasi di voi ha mai compiuto questo - e se sì, come hai fatto? E di causa: Vedete errori apparenti nel codice (speriamo che non sia molto da chiedere)
Si consiglia di utilizzare Fleck, accessibile NuGet: http://nuget.org/packages/Fleck/ –