- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
大家好:我正在尝试确保我的 TcpListener 可以正确处理来自客户端的多个请求。我正在尝试在 for 循环内调用多个 BeginSend 方法,发现 Listener 的输出在我得到的响应数量方面不一致。即,如果我连续调用 BeginSend 20 次,我希望 Listener 给我 20 个响应。有时我得到 2 个,有时 3 个,有时更多,而且看起来,我发送给 Listener 的消息被附加到另一个,而不是被视为单独的实体。
假设我有一个有效的 TcpClient 类(见代码),它包装了一个基本的 TcpClient 和一个有效的 TcpListener 类(见代码),它通过引发一个 DataReceived 事件来响应来自连接的 TcpClient 的消息,并将接收到的消息作为其参数。非常基本的代码
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 条单独消息的一些其他排列下面是 Listener 的相关代码:
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:
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);
}
}
最佳答案
it appears, that the messages I send to the Listener are being appended to one another, rather than being treated as separate entities.
这就是 TCP/IP 的工作原理。
如果您同时编写客户端和服务器,那么我建议使用 SignalR,它会保留消息边界。
如果您必须使用 TCP/IP,那么您将需要某种形式的 message framing .
关于.net - TcpListener 请求泛滥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396891/
我有一个 Linux 机器,我注意到每当我运行 adb 时,大量垃圾消息就会涌入系统日志,例如: Mar 09 17:22:39 laptoo kernel: hub 1-0:1.0: hub_res
我正在制作一个简单的命令行程序,用于使用 Python 中的 Twill 模块从网站(非常通用)收集和解析信息。我想使用 Twill 的 show() 命令将 HTML 输出分配给一个变量,以通过我的
我最近编写了一个处理大量吞吐量(每天 60+ 百万个请求)的小型服务,但它遇到了内存问题。起初,我查看了所有常见的嫌疑人,确信它必须是我写的东西,而不是与非常有用的、面向性能的 ServiceStac
使用 nvcc(使用 cuda 3.1)编译项目时,我从 gthr-default.h 收到大量警告: /usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../
我是一名优秀的程序员,十分优秀!