Próbuję zaimplementować serwer gniazd C#, ale daje mi to kilka kłopotów. Używam serwera WWW (ASP.NET) do hostowania strony z javascript, a serwer gniazda sieciowego jest zaimplementowany jako aplikacja konsoli C#.Serwer sieci Web: funkcja onopen na gnieździe sieciowym nigdy nie jest nazywana
Jestem w stanie wykryć próbę połączenia od klienta (chrome z obsługą javascript), a także pobrać handshake od klienta. Ale klient nie wydaje się akceptować uścisku dłoni, który wysyłam (funkcja onopen
w gnieździe internetowym nigdy nie jest wywoływana).
Czytałem The Web Socket protocol i nie widzę, co robię źle. Herezje trochę kodu serwera:
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();
biegnę do serwera WWW na porcie 8080 i serwerem websocket na porcie 8181, zarówno na moim localhost.
Próbowałem wysyłać uścisk dłoni w różnych kodowań (ASCII, bajtów i Hex), ale to nie wydaje się mieć znaczenia. Połączenie nigdy nie jest w pełni ustalone. javascript wygląda następująco:
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');
};
Zgaduję, że błąd tkwi w serwerze C# jak chrom wysyła informacje jak powinien, ale jako że funkcja onopen
nigdy nie jest wywoływana.
Moje pytanie w skrócie: Czy ktokolwiek z was kiedykolwiek to osiągnął - a jeśli tak, jak to zrobiłeś? I przyczyny: Czy widzisz jakieś oczywiste błędy w kodzie (mam nadzieję, że nie ma zbyt wiele do zapytania)
może chcesz używać Fleck, dostępny na Nuget: http://nuget.org/packages/Fleck/ –