首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TcpListener请求洪水

TcpListener请求洪水
EN

Stack Overflow用户
提问于 2017-06-06 18:05:24
回答 1查看 55关注 0票数 1

大家好:我正在努力确保我的TcpListener能够正确地处理来自客户端的多个请求。我正在一个for循环中尝试多个BeginSend方法调用,发现来自监听器的输出在我得到的响应数量方面不一致。也就是说,如果我连续调用BeginSend 20次,我希望听者给我20次答复。有时我得到2,有时3,有时更多,而且,看起来,我发送给侦听器的消息是相互附加的,而不是作为单独的实体处理的。

假设我有一个有效的TcpClient类(参见代码),它包装了一个基本的TcpClient,一个有效的TcpListener类(参见代码),它通过以接收到的消息作为参数引发DataReceived事件来响应来自连接TcpClient的消息。相当基本的代码

代码语言:javascript
复制
for(int i = 0; i < 10; i++)
{
    client.Client.BeginSend(Encoding.ASCII.GetBytes(i.ToString()), 0, i.ToString().Length, SocketFlags.None, null, null);
}

我希望TcpListener的输出是

0

1

..。

9

相反,我得到了这样的东西:

0

123456789

或,

0

1234

56

789

或,

……

或者10条单独消息的其他排列,这里是侦听器的相关代码:

代码语言:javascript
复制
    private void ListenForNewClients()
    {
        Task.Run(async () =>
        {
            while (true)
            {
                var tcpClient = await tcpServer.AcceptTcpClientAsync();

                clients.Add(tcpClient.Client);
                tcpClient.Client.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, ReceiveCallback, tcpClient.Client);

            }
        });
    }

ReceiveCallback:

代码语言:javascript
复制
    private void ReceiveCallback(IAsyncResult ar)
    {
        var tcpClient = ar.AsyncState as Socket;
        try
        {
            var bytesRead = tcpClient.EndReceive(ar);

            if (bytesRead == 0)
            {
                tcpClient.EndReceive(ar);
            }

            var data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

            DataReceived?.Invoke(this, data);

            buffer = new byte[BufferSize];
            tcpClient.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, ReceiveCallback, tcpClient);

        }
        catch
        {
            clients.Remove(tcpClient);
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-07 00:33:34

看来,我发送给侦听器的消息是相互附加的,而不是作为单独的实体处理的。

这就是TCP/IP的工作方式。

如果您同时编写客户机和服务器,那么我建议您使用保留消息边界的SignalR。

如果必须使用TCP/IP,则需要某种形式的消息帧

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44396891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档