[英]Receive data from websocket server (written in c#/vb.net) as image
[英]C# websocket server receive text from javascript
我目前正在测试一些基本的websocket示例,但这些示例并不能完全帮助我。 我了解如何使用C#在服务器上创建侦听器,以及如何将请求升级为Web套接字。 我需要帮助来检索从javascript发送到服务器的字符串。
C#代码:
class Program
{
private static void ThreadProc(object obj)
{
var client = (TcpClient)obj;
var address = client.Client.RemoteEndPoint.ToString().Split(':');
Console.WriteLine(String.Format("A client is connected from {0}", address[0]));
NetworkStream stream = client.GetStream();
//enter to an infinite cycle to be able to handle every change in stream
while (true)
{
while (!stream.DataAvailable) ;
Byte[] bytes = new Byte[client.Available];
stream.Read(bytes, 0, bytes.Length);
//translate bytes of request to string
String data = Encoding.UTF8.GetString(bytes);
if (new Regex("^GET").IsMatch(data))
{
Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
+ "Connection: Upgrade" + Environment.NewLine
+ "Upgrade: websocket" + Environment.NewLine
+ "Sec-WebSocket-Accept: " + Convert.ToBase64String(
SHA1.Create().ComputeHash(
Encoding.UTF8.GetBytes(
new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
)
)
) + Environment.NewLine
+ Environment.NewLine);
stream.Write(response, 0, response.Length);
}
else
{
Console.WriteLine(data);
}
}
}
static void Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80);
server.Start();
Console.WriteLine("Server has started on 127.0.0.1:80.{0}Waiting for a connection...", Environment.NewLine);
while (true)
{
var clientConnection = server.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, clientConnection);
}
}
}
用于连接到websocket的Javascript。
var host = window.location.origin.replace("http", "ws");
var socket = new WebSocket("ws://127.0.0.1:80");
socket.onopen = function (openEvent) {
console.log("Socket connection is open.");
sendTextMessage();
};
function sendTextMessage() {
if (socket.readyState != WebSocket.OPEN)
{
console.log("Socket is not open for connection.");
return;
}
socket.send("MDN");
}
更新我现在可以看到消息了。 但是,我没有得到字符串MDN,而是得到了一些时髦的字符。 更新了我的C#代码以显示更改。
我只是在尝试将javascript中的字符串发送到服务器,然后在控制台上读取该字符串。 如果任何人都可以说明更多如何同时连接多个Web浏览器,那将是很棒的。 另外,如果有人可以指出我要向所有连接的Web浏览器发送消息,请这样做。
如果这是重复的操作,请指出正确的方向。
问题 :“多个网络浏览器同时连接”
while(serverIsOn){
TcpClient cliTemp = server.AcceptTcpClient();
NetworkStream netTemp = cliTemp.GetStream();
Client cli = new Client(Necessary attributes);
clientsList.Add(cli);
}
每次获得一个连接时,将每个属性放入一个新对象(创建类Client)中,并带有从该客户端示例进行响应/接收所需的属性(TcpClient,NetworkStream,clientName ...)
[另一个线程]在客户端列表和调用Read之前的新循环:
循环(clientsList)
if(cli.networkStream.DataAvailable){ cli.networkStream.Read(buffer, 0, buffer.Lenght); }
问题 “更新,我现在可以看到消息。但是,我没有得到字符串MDN,但得到了一些时髦的字符。更新了C#代码以显示更改。” 我想您正在遵循本教程https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_server
它说来自JavaScript的消息响应包含某些位,这些位指示消息是否为最终消息,消息有多长时间,以及用于解码消息的关键代码,这是一个小解决方案:
public byte[] javaScriptUser(Byte[] data)
{
//encoded[1] => size of msg
Byte[] encoded = new Byte[((int)data[1] - 128)];
Array.Copy(data, 6, encoded, 0, encoded.Length);
Byte[] decoded = new Byte[((int)data[1] - 128)];
//KeyCode positions
Byte[] key = new Byte[4] { data[2], data[3], data[4], data[5] };
for (int i = 0; i < encoded.Length; i++)
{
decoded[i] = (Byte)(encoded[i] ^ key[i % 4]);
}
Array.Copy(decoded, data, decoded.Length);
return decoded;
}
不包括这部分! (“如果是126,则后面的2个字节(16位无符号整数),如果是127,则后面的8个字节(64位无符号整数)是长度。”)最后一部分有点混乱几分钟,但是我相信你可以做得更好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.