2017-11-17 21 views
0

ベアボーンWebSocketチャットルームサーバーを作成しようとしています。クライアントはサーバーに接続できますが、サーバーがリスニング状態になっていてもサーバーにメッセージを送信することはできません。C#WebSocketサーバーがHTML5クライアントからのメッセージを受信して​​いません

クライアントが接続すると、ヘッダ情報のようなものがコンソールに書き込まれます。しかし、WebSocket.send()がJavascriptで実行されると、サーバ側で何も起こりません。

HTML:

<button id="closeSocket">disconnect</button><br /> 
<input id = "inputField" /><button id="sendMessage">send</button> 
<div id = "output"></div> 

<script type = 'text/javascript' src = 'websockets.js'></script> 

Javascriptを:

websocket = new WebSocket("ws://127.0.0.1:80"); 

document.getElementById("closeSocket").onclick = closeSocket; 
document.getElementById("sendMessage").onclick = sendMessage; 

websocket.onopen = function(){ 
    output("connected"); 
} 

function sendMessage(){ 
    output("sent: " + document.getElementById('inputField').value); 
    websocket.send(document.getElementById('inputField').value); 
} 

websocket.onmessage = function(e){ 
    output("got response: " + e.data); 
} 

function closeSocket(){ 
    websocket.close(); 
} 

websocket.onclose = function(){ 
    output("disconnected"); 
} 

function output(t){ 
    document.getElementById("output").innerHTML += t + "<br />"; 
} 

C#のサーバ:

using System; 
using System.Net; 
using System.Net.Sockets; 

namespace WebSocketsTutorial { 
    class Program { 
     static void Main(string[] args) { 
      TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80); 
      TcpClient client = default(TcpClient); 

      server.Start(); 
      Console.WriteLine("server started"); 

      while (true) { 
       client = server.AcceptTcpClient(); 

       byte[] receivedBuffer = new byte[100]; 
       NetworkStream stream = client.GetStream(); 

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

       foreach (byte b in receivedBuffer) { 
        Console.Write(Convert.ToChar(b).ToString()); 
       } 
      } 
     } 
    } 
} 

これは、クライアントが接続したときに、コンソールに出力されているものです:

enter image description here

私が主にしているのは、任意の数の接続を許可し、最終的にサーバーが接続されたすべてのクライアントにユーザーの送信を返すようにすることです。

答えて

0

まず、WebSocketは単なる通常のソケットではありません。これは、HTTPと独自のフレーミングプロトコルを使用して接続ハンドシェイクを定義します。

https://en.wikipedia.org/wiki/WebSocket

https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

https://hpbn.co/websocket/

第二に、あなたはリクエストのちょうど最初の100のバイトを読んでいます。私は100文字以上入力を読んでいましたどのようにhttps://docs.microsoft.com/en-us/aspnet/core/fundamentals/websockets

+0

Read操作は0

デフォルト1を含め、WebSocketのサーバーを作成するために使用できるコンポーネントの無数がありますを返すまでは読むべき?私は無限ループでそれを持っているので、100バイトの入力を永久に読み取ると思った。私はクライアントがサーバーにメッセージを送信できない理由を説明していません –

+0

しかし、ループではあなたは新しいクライアントを受け入れています – vtortola

+0

ああ、何も変わっていません。私はクライアント= server.AcceptTcpClient()を移動しました。 whileループの上にあり、ループが無限に走ってコンソールウィンドウからすべてがスクロールされるようにしていました。 –