62 votes

Serveur Websocket: onopen de la fonction sur le web socket n'est jamais appelé

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)

48voto

Darin Dimitrov Points 528142

Probablement, il un problème de codage. Voici un travail C# serveur, j'ai écrit:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        listener.Start();
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}

Et le client hébergé sur localhost:8080:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
        var socket = new WebSocket('ws://localhost:8181/websession');
        socket.onopen = function() {
            alert('handshake successfully established. May send data now...');
        };
        socket.onclose = function() {
            alert('connection closed');
        };
    </script>
</head>
<body>
</body>
</html>

Cet exemple n'établit la poignée de main. Vous aurez besoin de modifier le serveur afin de continuer à accepter des données une fois la poignée de main a été établi.

24voto

Jon List Points 799

Après l'obtention de la web socket serveur de travail, j'ai créé un petit échantillon appilcation, et posté et l'article à ce sujet sur codeproject: Web Serveur Socket

Allez jeter un oeil et de télécharger de la source si vous êtes intéressé.

24voto

Kerry Jiang Points 935

Veuillez utiliser le codage UTF8 pour envoyer un message texte.

Il y a un open source serveur websocket qui est mis en œuvre en C#, vous pouvez l'utiliser directement.

http://superwebsocket.codeplex.com/

C'est mon projet open source!

3voto

Dave Hillier Points 4391

L' .NET Framework 4.5 présente la prise en charge pour les WebSockets dans Windows La Communication De La Fondation. Les WebSockets est un moyen efficace, basée sur des normes la technologie qui permet la communication bidirectionnelle-dessus de la norme HTTP les ports 80 et 443. L'utilisation de la norme ports HTTP permettre Les WebSockets pour communiquer sur le web par le biais d'intermédiaires. Deux nouvelle norme liaisons ont été ajoutés pour prendre en charge la communication sur une WebSocket de transport. NetHttpBinding et NetHttpsBinding. Les WebSockets paramètres spécifiques peuvent être configurés sur le HttpTransportBinding élément en accédant à la WebSocketSettings de la propriété.

Je pense toujours que ça utilise du SAVON si

http://msdn.microsoft.com/en-us/library/hh674271(v=vs. 110).aspx

0voto

TheQult Points 98

Les WebSockets nécessite une poignée de main et l'encodage de prendre un coup d'oeil ici pour l'encodage

https://github.com/matteofabbri/netfluid/blob/master/NetFluid%20III/IO/WebSocketStream.cs

et ici pour la reconnaissance

https://github.com/matteofabbri/netfluid/blob/master/NetFluid%20III/Security.cs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X