2016-07-27 15 views
0

Ich teste gerade einige grundlegende Websocket Beispiele, die mir nicht vollständig mit den Grundlagen helfen. Ich verstehe, wie Sie mit C# einen Listener auf dem Server erstellen und die Anfrage als Web-Socket aktualisieren. Ich brauche Hilfe beim Abrufen einer Zeichenfolge, die von Javascript an den Server gesendet wird.C# websocket Server erhalten Text von Javascript

C# Code:

class Program 
{ 
    private static void ThreadProc(object obj) 
    { 
     var client = (TcpClient)obj; 

     var address = client.Client.RemoteEndPoint.ToString().Split(':'); 

     Console.WriteLine(String.Format("A client is connected from {0}", address[0])); 

     NetworkStream stream = client.GetStream(); 

     //enter to an infinite cycle to be able to handle every change in stream 
     while (true) 
     { 
      while (!stream.DataAvailable) ; 

      Byte[] bytes = new Byte[client.Available]; 

      stream.Read(bytes, 0, bytes.Length); 

      //translate bytes of request to string 
      String data = Encoding.UTF8.GetString(bytes); 

      if (new Regex("^GET").IsMatch(data)) 
      { 
       Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine 
        + "Connection: Upgrade" + Environment.NewLine 
        + "Upgrade: websocket" + Environment.NewLine 
        + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
         SHA1.Create().ComputeHash(
          Encoding.UTF8.GetBytes(
           new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
          ) 
         ) 
        ) + Environment.NewLine 
        + Environment.NewLine); 

       stream.Write(response, 0, response.Length); 
      } 
      else 
      { 
       Console.WriteLine(data); 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80); 

     server.Start(); 
     Console.WriteLine("Server has started on 127.0.0.1:80.{0}Waiting for a connection...", Environment.NewLine); 

     while (true) 
     { 
      var clientConnection = server.AcceptTcpClient(); 
      ThreadPool.QueueUserWorkItem(ThreadProc, clientConnection); 
     } 

    } 
} 

Javascript zu websocket verbinden.

var host = window.location.origin.replace("http", "ws"); 
    var socket = new WebSocket("ws://127.0.0.1:80"); 

    socket.onopen = function (openEvent) { 
     console.log("Socket connection is open."); 
     sendTextMessage(); 
    }; 

    function sendTextMessage() { 
     if (socket.readyState != WebSocket.OPEN) 
     { 
      console.log("Socket is not open for connection."); 
      return; 
     } 
     socket.send("MDN"); 
    } 

aktualisieren kann ich die Meldung in jetzt kommen sehen. Allerdings bekomme ich die Zeichenfolge MDN nicht, ich bekomme einige funky Charaktere zurück. Mein C# -Code wurde aktualisiert, um Änderungen anzuzeigen.

Ich versuche nur eine Zeichenfolge von meinem Javascript in meinen Server zu senden und diese Zeichenfolge auf der Konsole zu lesen. Wenn jemand noch mehr erklären kann, wie mehrere Webbrowser gleichzeitig verbunden sind, wäre das großartig. Auch wenn mich jemand auf den Versand von Nachrichten an alle angeschlossenen Webbrowser hinweisen kann, tun Sie dies bitte.

Wenn dies ein Duplikat ist, weisen Sie mich bitte in die richtige Richtung.

+0

Ich hatte das gleiche Problem und die Funktion DecodeMessage von diesem Beitrag hat mir geholfen: http://StackOverflow.com/Questions/34372639/Sending-A-Message-Back-ToClient-Use-Tcplistener-Server/34372944 –

+0

Eigentlich hatte ich eine Menge Probleme mit diesem Code und nach der Recherche nutze ich jetzt SignalR, dieses Beispiel hilft mir sehr: https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms- f1ec847b –

Antwort

1

Frage: „mehrere Web-Browser zur gleichen Zeit in connected“

while(serverIsOn){ 
    TcpClient cliTemp = server.AcceptTcpClient(); 
    NetworkStream netTemp = cliTemp.GetStream(); 
    Client cli = new Client(Necessary attributes); 
    clientsList.Add(cli); 
} 

jedes Mal, wenn Sie eine Verbindung jedes Attribut in einem neuen Objekt gesetzt bekommen mit den Attributen notwendig zu reagieren (Klasse-Client erstellen)/von diesem Client Beispiel (TcpClient, Network, client ...)

[Ein weiteres Thema] New Schleife durch die Liste der Clients und vor dem Aufruf von Read erhalten:

Schleife (clientsList)

if(cli.networkStream.DataAvailable){ 
    cli.networkStream.Read(buffer, 0, buffer.Lenght); 
} 

Frage „Update ich die Meldung in jetzt kommen sehen können. Allerdings bekomme ich die Zeichenfolge MDN nicht, ich bekomme einige funky Charaktere zurück. Aktualisiert Code meine C# Änderungen zu zeigen.“ Ich nehme an, Sie dieses Tutorial folgenden wurden https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_server

Er sagt, die Antwort auf die Nachricht von JavaScript bestimmten Bits enthält, die, wenn die Nachricht angeben, ist endgültig, wie lange ist die Botschaft, und ein Schlüsselcode zu entschlüsseln die Nachricht hier ist eine kleine Lösung:

public byte[] javaScriptUser(Byte[] data) 
    { 
     //encoded[1] => size of msg 
     Byte[] encoded = new Byte[((int)data[1] - 128)]; 
     Array.Copy(data, 6, encoded, 0, encoded.Length); 
     Byte[] decoded = new Byte[((int)data[1] - 128)]; 

     //KeyCode positions 
     Byte[] key = new Byte[4] { data[2], data[3], data[4], data[5] }; 

     for (int i = 0; i < encoded.Length; i++) 
     { 
      decoded[i] = (Byte)(encoded[i]^key[i % 4]); 
     } 
     Array.Copy(decoded, data, decoded.Length); 
     return decoded; 
    } 

nicht diesen Teil enthalten ("wenn es 126, das folgende 2 Bytes (16-Bit-Ganzzahl), wenn 127 der folgenden 8 Byte (64-Bit unsigned Integer) sind die Länge. ") Dieser letzte Teil ist ein bisschen chaotisch war in ein paar Minuten fertig, aber ich bin mir sicher, dass Sie es besser machen können