Je suis en train de mettre en œuvre un C# web serveur socket, mais sa me donne quelques soucis. Je fais tourner un serveur web(ASP.NET pour héberger la page avec le javascript et le web socket server est exécuté comme une application console C#.
Je suis en mesure de détecter la tentative de connexion du client (chrome exécution du javascript) et de récupérer la poignée de main de la part du client. Mais le client ne semble pas accepter la poignée de main, je suis de l'envoi de retour ( onopen
de la fonction sur le web socket n'est jamais appelé).
J'ai lu le Web Socket protocole et je ne vois pas ce que je fais mal. Heres un peu de code du serveur:
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();
Je suis en cours d'exécution sur le serveur web sur le port 8080 et le web serveur socket sur le port 8181, à la fois sur mon localhost.
J'ai essayé d'envoyer la poignée de main dans les différents jeux de caractères (ASCII, octets et Hex) mais cela ne semble pas faire une différence. La connexion n'est jamais pleinement établie. Le javascript ressemble à ceci:
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');
};
Je suppose que l'erreur se trouve dans le C# serveur de google chrome est l'envoi de l'information comme il se doit, mais comme dit l' onopen
fonction n'est jamais appelée.
Donc ma question en bref: A l'un de vous à jamais accompli cela, et si oui, comment avez-vous fait? Et de la cause: voyez-vous une erreur apparente dans le code (espérons que c'est pas trop demander)