当前位置: 首页 > 资讯中心 > 游戏攻略 > WebSocket协议中的网络缓冲区和多个WebSocket与http服务器共用一个端口的问题

WebSocket协议中的网络缓冲区和多个WebSocket与http服务器共用一个端口的问题

来源:网络作者:提莫时间:2024-05-22 08:59:47
分享到:
标签:
上一篇我已经实现了聊天室,并且在协议中实现了4种类型的消息传输。其实还可以添加video,audio,live等等类型。 不过假如把目前的协议看作RCP1.0版的话,这个版本就只支持有限的4种消息。精力有限啊。也许RCP2.0就可以把video,audio类型加进去? 这不是这篇番外考虑的。而是我在

上一篇我已经实现了聊天室,并且在协议中实现了4种类型的消息传输。其实还可以添加 video audio live 等等类型。
不过假如把目前的协议看作 RCP1.0 版的话,这个版本就只支持有限的4种消息。精力有限啊。也许 RCP2.0 就可以把 video audio 类型加进去?
这不是这篇番外考虑的。而是我在定义和实现协议的过程中注意到了一些问题。

系统的网络缓冲区是怎么回事?

因为我自己定义了一个400字节的buffer用来接收消息。如果接收到的消息超出了400字节, WebSocket 会给出提示,将 EndOfMessage 字段设置为false。
这到底是

  • 客户端暂停了本次发送,等到服务器再一次执行 ReceiveAsync 方法时才继续发送?
  • 还是 WebSocket 对象本身内置了缓冲区?消息全部都暂存在缓冲区?

我使用浏览器开发者工具监视了ws消息发送过程,结合后台断点调试,发现 WebSocket 采用了第二种方案。把消息全部存在缓冲区,我用buffer读一次,就取出来一点。
既然是缓冲区,那么一个 WebSocket 对象的内置缓冲区有多大?客户端发送的文件长度超过了 WebSocket 对象的内置缓冲区的大小时怎么办?
看看websocket协议怎么说

看起来websocket 协议中数据长度上限为 2^127,可以认为没有限制。因而在实际使用中 websocket 消息长度限制只取决于服务器实现。

System.Net.WebSockets.WebSocket 对象内部一定使用了一个 MemoryStream 之类的东西来暂存数据。
问题是那为什么他不直接把那个缓冲区给我?我还要自己再去创建一个缓冲区,从他的缓冲区读数据?我不太清楚。

多个WebSocket与http服务器怎么共用一个端口?

典型的socket监听{IP:Port}
但是我在websocket中没有看到这些信息。

如果你的 Web API 服务器在端口 80 上运行,那么 WebSocket 连接也会使用端口 80 来传输数据

比较疑惑的是,操作系统接收到一个TCP数据包,怎么知道交给http服务器,还是哪个websocket连接?
原来一个TCP端口可以建立多个TCP连接,只要 (服务器IP:服务器Port:客户端IP:客户端Port) 唯一就行。
看看调试

TCP连接 服务器IP 服务器Port 客户端IP 客户端Port 连接Id
游客_1 ::1 5234 ::1 54008 0HN3PID8UHKHN
游客_2 ::1 5234 ::1 54481 0HN3PID8UHKHO
游客_3 ::1 5234 ::1 54556 0HN3PID8UHKHP

操作系统就是根据这个表决定把从端口接收的数据发往哪个游客线程。

看看实际连接是怎么样的?

手动管理连接看看?

由于websockt我们看不到客户端发起连接,服务端接收连接的过程,我自己用socket测试一下。
代码非常简单

  • 服务器监听端口
  • 等待客户端连接,然后维护到一个集合中
  • 每接到连接,就开启一个聊天线程
static void Main(string[] args)
{
    //服务器
    if (args.Length == 1) { 
        int serverPort = Convert.ToInt32(args[0]);
        var server = new TcpListener(IPAddress.Parse("127.0.0.1"),serverPort);
        Console.WriteLine($"TCP服务器  127.0.0.1:{serverPort}");
        server.Start();
        int cnt = 0;
        Task.Run(async() =>
        {
            List<TcpClient> clients= new List<TcpClient>();
            while (true)
            {
                TcpClient client = await server.AcceptTcpClientAsync();
                clients.Add(client);
                cnt++;
                var ep = client.Client.RemoteEndPoint as IPEndPoint;
                Console.WriteLine($"TCP客户端_{cnt}  {ep.Address}:{ep.Port}");
                //给这个客户端开一个聊天线程
                //操作系统将会根据游客端口对应表将控制权交给对应游客线程
                StartChat(client);
            }
        }).Wait();
    }
    //客户端
    else if (args.Length == 3)
    {
        int clientPort = Convert.ToInt32(args[0]);
        int serverPort = Convert.ToInt32(args[1]);
        string msg = args[2];
        var client=new TcpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), clientPort));
        Console.WriteLine($"TCP客户端  127.0.0.1:{clientPort}");
        Task.Run(async () =>
        {
            await client.ConnectAsync(new IPEndPoint(IPAddress.Parse("127.0.0.1"), serverPort));
            Console.WriteLine($"连接到 127.0.0.1:{serverPort}");
            //打招呼
            var msgBytes=UTF8Encoding.UTF8.GetBytes(msg);
            await client.Client.SendAsync(msgBytes);
            //等待数据,阻塞在这里,保持连接
            await client.Client.ReceiveAsync(new ArraySegment<byte>(new byte[100]));
        }).Wait();
    }
}

public static async Task StartChat(TcpClient client)
{
    var buffer = new byte[100];
    while (true)
    {
        //阻塞接收消息
        int msgLength = await client.Client.ReceiveAsync(new ArraySegment<byte>(buffer));
        string str=UTF8Encoding.UTF8.GetString(buffer,0,msgLength);
        Console.WriteLine(str);
    }
}

我们测试建立一个服务端,和三个连接到这个服务端的客户端
虽然三个游客都向一个服务器端口5234发送消息,但操作系统根据端口连接对应表知道将消息发送给哪个线程。就好像在一个端口划分出来了3个信道。

  • 每个信道可以使用具体的http协议或我们写的RCP协议来序列化和反序列化
  • 要注意的是,这些不同的连接(TcpClient)是同一个TCPLisener对象到的。这就是在一个程序中使用多种通信协议。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

相关阅读

装机必备软件
  • 下载总排行
  • 下载月排行

1高德地图2021

新闻资讯

2大众点评

聊天社交

3迅雷

壁纸主题

4一波语音

聊天社交

5知乎

摄影摄像

6映客

学习教育

7花小猪打车

学习教育

8哈啰出行最新版

聊天社交

9qq邮箱

摄影摄像

10贝壳找房

生活健康