2017-02-01 9 views
0

私はC#を使用してWebSocketサーバーを構築しようとしています。C#ビルドWebソケットサーバー

だから私は私のサーバーへの接続を行うために、Googleのクロム

中でAdvanced Rest Client (ARC)を使用していますが、「リモートサーバーへの接続」でハングしているようです。 WebSocketへの昇格のための

マイコード

Console.WriteLine("Connection Establised to: " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString()); 
// sets two streams 
StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.UTF8); 
StreamReader sReader = new StreamReader(client.GetStream(), Encoding.UTF8); 
// you could use the NetworkStream to read and write, 
// but there is no forcing flush, even when requested 

Boolean bClientConnected = true; 
String sData = null; 

bool gotHeaders = false; 
string headerBlock = ""; 
try 
{ 
    while (!gotHeaders) 
    { 
     sData = sReader.ReadLine(); 
     headerBlock += sData + "\r\n"; 
     Console.WriteLine("Client << " + sData); 
     if (headerBlock.Substring(headerBlock.Length - 4, 4) == "\r\n\r\n") 
     { 
      gotHeaders = true; 
     } 
    } 
    string headerResponse = "HTTP/1.1 101 Switching Protocols\r\n" 
    + "Connection: Upgrade\r\n" 
    + "Upgrade: websocket\r\n" 
    + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
     SHA1.Create().ComputeHash(
      Encoding.UTF8.GetBytes(
       new Regex("Sec-WebSocket-Key: (.*)").Match(headerBlock).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
      ) 
     ) 
    ) + "\r\n\r\n"; 
    Console.WriteLine("Server >> HTTP/1.1 101 Switching Protocols\r\n" 
    + "Server >> Connection: Upgrade\r\n" 
    + "Server >> Upgrade: websocket\r\n" 
    + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
     SHA1.Create().ComputeHash(
      Encoding.UTF8.GetBytes(
       new Regex("Sec-WebSocket-Key: (.*)").Match(headerBlock).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
      ) 
     ) 
    ) 
    + "\r\nServer >>\r\n"); 
    sWriter.WriteLine(headerResponse); 
} 
catch (Exception) 
{ 
    bClientConnected = false; 
    client.Close(); 
} 

// to write something back. 
while (bClientConnected) 
{ 
    try 
    { 
     sData = sReader.ReadLine(); 
     Console.WriteLine("Client >> " + sData); 
     sWriter.WriteLine(""); 
     sWriter.Flush(); 
    } 
    catch (Exception) 
    { 
     bClientConnected = false; 
     client.Close(); 
     continue; 
    } 
} 

サーバー出力:

Connection Establised to: 127.0.0.1 
Client << GET/HTTP/1.1 
Client << Host: 127.0.0.1:8080 
Client << Connection: Upgrade 
Client << Pragma: no-cache 
Client << Cache-Control: no-cache 
Client << Upgrade: websocket 
Client << Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo 
Client << Sec-WebSocket-Version: 13 
Client << User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Client << Accept-Encoding: gzip, deflate, sdch, br 
Client << Accept-Language: en,nl;q=0.8,en-GB;q=0.6 
Client << Sec-WebSocket-Key: tThSdzoXlh+jFiILH5pXSw== 
Client << Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 
Client << 
Server >> HTTP/1.1 101 Switching Protocols 
Server >> Connection: Upgrade 
Server >> Upgrade: websocket 
Server >> Sec-WebSocket-Accept: DBANtxNFhA+xdRW4JFvwP1HwpHA= 
Server >> 

だから私のサーバーが正しく応答していると、クライアントは私が出て働くことができない私に何かを送信していませんなぜ私のサーバーに生のメッセージを送信するためのコンソールを私に与えてくれませんか?

+0

2番目のwhileループにBreakpointまたはConsole.WriteLine()を追加して、 'sData = sReader.ReadLine();'行に到達していることを確認してください。 –

+1

また、 'Try {} Catch {}'を使っている場合は、常に出力を追加するか例外をスローするので、例外であることがわかります – Sergio

+0

@Sergioこれは私のやっている作業です。私はちょうどそれを今のところ働かせようとしています。 –

答えて

0

だから、これは私が私のヘッダを書き込んだ後sWriter.Flush();がありませんでしたので、多くの問題を引き起こしうるさく、単純な問題で、

ました。

関連する問題