C# Websocket服务器,客户端可以';握手
我正在使用最新版本的Chrome(websocket版本13)进行测试 这是我的简单客户端页面,位于C# Websocket服务器,客户端可以';握手,c#,websocket,listener,C#,Websocket,Listener,我正在使用最新版本的Chrome(websocket版本13)进行测试 这是我的简单客户端页面,位于http://127.0.0.1/folder/default.aspx: <script type="text/javascript"> var socket = new WebSocket('ws://localhost:8181/websession'); socket.onopen = function () { alert('handshake
http://127.0.0.1/folder/default.aspx
:
<script type="text/javascript">
var socket = new WebSocket('ws://localhost:8181/websession');
socket.onopen = function () {
alert('handshake successfully established. May send data now...');
};
socket.onclose = function () {
alert('connection closed');
};
socket.onmessage = function(msg) {
alert(msg);
};
</script>
当我运行服务器,然后加载客户端页面时,它只会说“连接已关闭”
有人能告诉我如何正确地进行握手吗?从文档和前面的问题可以看出,我发送回客户机的响应看起来是正确的。您还没有计算安全哈希。客户端向您发送一个数字,规范中还有另一个硬编码数字。您需要按照规范中的说明将它们组合起来,并将其作为标题返回 这表明您的服务器实际上是一个web套接字服务器 看
注意,您可能还想考虑是否执行HiXee 76,除了RFC.
,根据您的代码,这应该至少(用Chrome)工作/P>
查看服务器发送的消息内容。dispose上的StreamReader和StreamWriter正在关闭底层流(NetworkStream)。因此客户端页面仅显示“连接已关闭”您是否已逐步完成代码?它是否会在我已经走过的某个点停止,但我有点不确定我应该寻找什么。所有的代码似乎都在按照我的预期运行。而且,状态不是“交换协议”吗?在这个回答中有很多地方看起来不太对劲。@Tom我很想把我为堆栈溢出/堆栈交换编写的web套接字服务器推向开源——处理80k+并发连接…@Marc很想看到这一点!请让我知道,如果你做开源它
var listener = new TcpListener(IPAddress.Loopback, 8181);
listener.Start();
while (true)
{
Console.WriteLine("Listening...");
using (var client = listener.AcceptTcpClient())
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
writer.WriteLine("Upgrade: WebSocket");
writer.WriteLine("Connection: Upgrade");
writer.WriteLine("WebSocket-Origin: http://127.0.0.1");
writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
writer.WriteLine("");
}
Console.WriteLine("Finished");
}
var listener = new TcpListener(IPAddress.Loopback, 8181);
listener.Start();
while (true)
{
Console.WriteLine("Listening...");
using (var client = listener.AcceptTcpClient())
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
string line = null, key = "", responseKey = "";
string MAGIC_STRING = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
while (line != "")
{
line = reader.ReadLine();
if (line.StartsWith("Sec-WebSocket-Key:"))
{
key = line.Split(':')[1].Trim();
}
}
if (key != "")
{
key += MAGIC_STRING;
using (var sha1 = SHA1.Create())
{
responseKey = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(key)));
}
}
// send handshake to the client
writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
writer.WriteLine("Upgrade: WebSocket");
writer.WriteLine("Connection: Upgrade");
writer.WriteLine("WebSocket-Origin: http://127.0.0.1");
writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
if (!String.IsNullOrEmpty(responseKey))
writer.WriteLine("Sec-WebSocket-Accept: " + responseKey);
writer.WriteLine("");
writer.Flush();
SendString(stream, "This code works!!!!");
SendString(stream, "This code also works!!!! ".PadRight(300, '.') + "\r\nEND");
}
Console.WriteLine("Finished");
}
void SendString(Stream s, string str)
{
var buf = Encoding.UTF8.GetBytes(str);
int frameSize = 64;
var parts = buf.Select((b, i) => new { b, i })
.GroupBy(x => x.i / (frameSize - 1))
.Select(x => x.Select(y => y.b).ToArray())
.ToList();
for (int i = 0; i < parts.Count; i++ )
{
byte cmd = 0;
if (i == 0) cmd |= 1;
if (i == parts.Count - 1) cmd |= 0x80;
s.WriteByte(cmd);
s.WriteByte((byte)parts[i].Length);
s.Write(parts[i], 0, parts[i].Length);
}
s.Flush();
}
socket.onmessage = function(msg) {
alert(msg.data);
};