我在C#(客户端-服务器)中开发了一个应用程序,使用套接字在客户端和服务器之间进行通信。现在,我想使用javascript为android创建相同的应用程序(基于关于javascript的开发指南),但要保留用C#制作的服务器(我可以更改通信部分,但不太多)。以下是代码的外观:
服务器端:
connection.Send(Encoding.ASCII.GetBytes("HTTP/1.1 101 Switching ProtocolsrnUpgrade: WebSocketrnConnection: UpgradernSec-WebSocket-Accept: " + aux));
connection.Send(Encoding.ASCII.GetBytes("rnrn"));
其中aux是:
public static String ComputeWebSocketHandshakeSecurityHash09(String secWebSocketKey)
{
const String MagicKEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
String secWebSocketAccept = String.Empty;
// 1. Combine the request Sec-WebSocket-Key with magic key.
String ret = secWebSocketKey + MagicKEY;
Console.WriteLine("- " + ret + " -");
// 2. Compute the SHA1 hash
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] sha1Hash = sha.ComputeHash(Encoding.UTF8.GetBytes(ret));
// 3. Base64 encode the hash
secWebSocketAccept = Convert.ToBase64String(sha1Hash);
return secWebSocketAccept;
}
我用javascript创建了一个带有websocket的客户端,该客户端连接到一个c sharp服务器。问题是握手后,我的连接关闭了,我不知道为什么。我得到的唯一错误是:"无法识别的帧操作码:7"。我使用谷歌浏览器16.0.912.75。
循序渐进:
- WebSocket可用
- 服务器接收握手请求
- 生成Sec WebSocket Accept并将其发送到浏览器
- 浏览器识别密钥并执行.onpen方法
之后我得到错误
var ws; $(document).ready(function () { // test if the browser supports web sockets if ("WebSocket" in window) { debug("Browser supports web sockets!", 'success'); connect($('#host').val()); $('#console_send').removeAttr('disabled'); } else { debug("Browser does not support web sockets", 'error'); }; // function to send data on the web socket function ws_send(str) { try { ws.send(str); } catch (err) { debug(err, 'error'); } } // connect to the specified host function connect(host) { debug("Connecting to " + host + " ..."); try { ws = new WebSocket(host); // create the web socket } catch (err) { debug(err, 'error'); } $('#host_connect').attr('disabled', true); // disable the 'reconnect' button ws.onopen = function () { debug("connected... ", 'success'); // we are in! Big Grin | :-D }; ws.onmessage = function (evt) { debug(evt.data, 'response'); // we got some data - show it omg!! }; ws.onclose = function () { debug("Socket closed!", 'error'); // the socket was closed (this could be an error or simply that there is no server) $('#host_connect').attr('disabled', false); // re-enable the 'reconnect button }; }; // function to display stuff, the second parameter is the class of the <p> (used for styling) function debug(msg, type) { $("#console").append('<p class="' + (type || '') + '">' + msg + '</p>'); }; // the user clicked to 'reconnect' button $('#host_connect').click(function () { debug("n"); connect($('#host').val()); }); // the user clicked the send button $('#console_send').click(function () { ws_send($('#console_input').val()); }); $('#console_input').keyup(function (e) { if(e.keyCode == 13) // enter is pressed ws_send($('#console_input').val()); }); });
如果您需要更多信息,请回复。我正在谷歌上搜索这个操作码:7的问题大约4小时。
您还应该看看SuperWebSocket,它是一个开源的.NET WebSocket服务器。看一下那里的代码应该可以帮助您解决问题。