【发布时间】:2015-01-17 06:08:19
【问题描述】:
我已经在 C# Web Socket 服务器上工作了大约 24 小时。
我目前已经弄清楚如何完成握手并初始化连接。
我还想出了如何获取byte[] 数据并将其解码为原始字符串。
但现在我陷入困境并寻求帮助。
我似乎无法弄清楚如何组合正确的数据结构并将其发送回客户端。 如果您发送原始数据,您在客户端收到的 WebSocket 会告诉您数据不能被屏蔽(这就是它需要解码的原因)。
所以基本上,我要问的是如何构造响应数据以发送回 WebSocket 客户端?
我一直使用https://www.rfc-editor.org/rfc/rfc6455 作为我的研究资源。
请记住,我只是为此使用常规套接字。
这是我的解码代码:
if (dataBuffer.Length > 0)
{
if (dataBuffer[0] == 129)
{
int msg_length = dataBuffer[1] - 128;
if (msg_length <= 125)
{
// Msg ready to decode.
Log.info("Message Length: " + msg_length);
Byte[] decoded = new Byte[dataBuffer.Length];
Byte[] encoded = new Byte[dataBuffer.Length - 6];
Array.Copy(dataBuffer, 6, encoded, 0, msg_length);
Byte[] key = new Byte[4] { dataBuffer[2], dataBuffer[3], dataBuffer[4], dataBuffer[5] };
for (int i = 0; i < encoded.Length; i++)
{
decoded[i] = (Byte)(encoded[i] ^ key[i % 4]);
}
Log.info("MSG: " + Encoding.UTF8.GetString(decoded));
byte[] return_msg = new byte[decoded.Length + 8];
return_msg[0] = 1;
return_msg[1] = 0;
return_msg[2] = 0;
return_msg[3] = 0;
// OP Code
return_msg[4] = 0x1;
return_msg[5] = 0x0;
return_msg[6] = 0x0;
return_msg[7] = 0x0;
Array.Copy(decoded, 0, return_msg, 8, decoded.Length);
socket.Send(return_msg);
}
else if (msg_length == 126)
{
// Longer Message
msg_length = dataBuffer[2] + dataBuffer[3];
Log.info("Message Length: " + msg_length);
Byte[] key = new Byte[4] { dataBuffer[4], dataBuffer[5], dataBuffer[6], dataBuffer[7] };
Byte[] decoded = new Byte[dataBuffer.Length];
Byte[] encoded = new Byte[dataBuffer.Length - 8];
Array.Copy(dataBuffer, 8, encoded, 0, msg_length);
for (int i = 0; i < encoded.Length; i++)
{
decoded[i] = (Byte)(encoded[i] ^ key[i % 4]);
}
Log.info("MSG: " + Encoding.UTF8.GetString(decoded));
byte[] return_msg = new byte[decoded.Length + 4];
return_msg[0] = 129;
return_msg[1] = 0;
return_msg[2] = 0;
return_msg[3] = 0;
Array.Copy(decoded,0,return_msg,4,decoded.Length);
socket.Send(return_msg);
}
else if (msg_length == 127)
{
// Huge Message:
Log.info("BIG MESSAGE");
}
}
}
【问题讨论】:
-
您学习 Socket 是为了好玩还是为了完成工作?如果是后者,你检查过 TcpClient 吗?它为你做了很多工作。
-
我认为手动操作是一种更好的学习体验。
标签: c# c#-4.0 websocket server-side server