gpt4 book ai didi

javascript - C# websocket服务器从javascript接收文本

转载 作者:行者123 更新时间:2023-12-03 06:26:35 24 4
gpt4 key购买 nike

我目前正在测试一些基本的 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 发送到我的服务器并在控制台上读取该字符串。如果有人可以更多地解释如何同时连接多个网络浏览器,那就太棒了。另外,如果有人可以指示我将消息发送回所有连接的网络浏览器,请这样做。

如果这是重复的,请指出正确的方向。

最佳答案

问题:“同时连接多个网络浏览器”

while(serverIsOn){
TcpClient cliTemp = server.AcceptTcpClient();
NetworkStream netTemp = cliTemp.GetStream();
Client cli = new Client(Necessary attributes);
clientsList.Add(cli);
}

每次获得一个连接时,都将每个属性放入一个新对象中(创建类 Client),其中包含从该客户端示例响应/接收所需的属性(TcpClient、NetworkStream、clientName...)

[另一个线程]在调用 Read 之前对客户端列表进行新循环:

loop(clientsList)

if(cli.networkStream.DataAvailable){
cli.networkStream.Read(buffer, 0, buffer.Lenght);
}

问题“更新我现在可以看到消息传入。但是,我没有得到字符串 MDN,我得到了一些奇怪的字符。更新了我的 C# 代码以显示更改。”我想您正在学习本教程 https://developer.mozilla.org/en-US/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位无符号整数)就是长度。”)最后一部分有点困惑,只用了几分钟就完成了,但我相信你可以做得更好

关于javascript - C# websocket服务器从javascript接收文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38624124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com