저는 C# Web Socket 서버에서 약 24 시간 동안 작업했습니다.C# - Websocket - 클라이언트에게 메시지 보내기
현재 핸드 셰이크를 완료하고 연결을 초기화하는 방법을 알아 냈습니다.
또한 byte[]
데이터를 가져 와서 원래의 문자열로 디코딩하는 방법을 알아 냈습니다.
하지만 지금은 붙어있어 도움을 찾고 있습니다.
올바른 데이터 구조를 조합하여 클라이언트에 다시 보내는 방법을 알아낼 수 없습니다. 받은 원본 데이터를 보내면 클라이언트 측 웹 소켓 을 마스크 처리 할 수 없다는 메시지가 나타납니다 (이것이 디코딩되어야하는 이유입니다).
그래서 기본적으로 WebSocket 클라이언트로 응답 데이터를 보내려면 어떻게 구성해야합니까?
저는 연구를 위해 http://tools.ietf.org/html/rfc6455을 리소스로 사용했습니다.
여기에 일반 소켓 만 사용하고 있습니다.
https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers
https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server
그들이 모두처럼 보인다 :
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");
}
}
}
재미있는 일이나 직업을 배우고 있습니까? 후자의 경우 TcpClient를 체크 아웃 했습니까? 그것은 당신을 위해 많은 일을합니다. –
나는 그것을 수동으로하는 것이 더 나은 학습 경험이라고 생각했다. –