C#Webソケットサーバーを実装しようとしていますが、いくつかの問題が発生します。javascriptを使用してページをホストするためにWebサーバー(ASP.NET)を実行しており、WebソケットサーバーはC#コンソールアプリケーションとして実装されています。
クライアント(javascriptを実行しているchrome)からの接続試行を検出し、クライアントからハンドシェイクを取得することもできます。しかし、クライアントは私が送り返しているハンドシェイクを受け入れていないようです(onopen
Webソケットの関数が呼び出されることはありません)。
Web Socketプロトコルを読んでいますが、何が間違っているのかわかりません。サーバーコードの一部を次に示します。
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();
ローカルホストで、ポート8080のWebサーバーとポート8181のWebソケットサーバーを実行しています。
ハンドシェイクをさまざまなエンコーディング(ASCII、バイト、16進数)で送信しようとしましたが、違いはないようです。接続が完全に確立されることはありません。javascriptは次のようになります。
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');
};
chromeが情報を適切に送信しているため、エラーはC#サーバーにあると推測していますが、前述のように、onopen
関数は呼び出されません。
要するに私の質問です: あなたの誰かがこれを達成したことがありますか?もしそうなら、どのようにそれをしましたか?そして原因:コードに明らかなエラーがありますか(あまり質問しないことを願っています)