是网络/套接字连接的新手。阅读了很多文章和stackoverflow问题之后。我想出了不同的方法,并最终确定将下面的高级代码用于我的Asynch TCP侦听器
public class DeviceListener
{
private TcpListener listener = null;
public DeviceListener(Ip,PortNo)
{
listener = new TcpListener(Ip,PortNo);
}
public void StartListener()
{
listener.Start();
//TODO: Log listening started here
WaitForClients();
}
private void WaitForClients()
{
listener.BeginAcceptTcpClient(OnClientConnected, null);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
WaitForClients();
TcpClient client = listener.EndAcceptTcpClient(asyncResult);
if(client != null)
{
//TODO: Log connected
HandleClientRequest(client);
}
}
private void HandleClientRequest(TcpClient client)
{
//Code to process client request
//Dispose Client
}
}
根据我的要求,我需要2-3个侦听器。因此,请使用相同的IP地址和不同的端口创建一个新的侦听器实例,这将作为上述方法的输入。(假设我在端口 5000 和xxx中使用Ipxxx.xx.xx.xx。端口 5001 中的xx.xx.xx)
在同一网络中设置的我的第三方客户端(第一个客户端侦听端口5000和第二个客户端侦听端口5001)作为客户端,他们每秒发送一次 KeepAlive消息, 500ms
超时HanleClientRequestMethod高级
byte[] buffer = new byte[1024];
string data = null;
using (NetworkStream stream = client.GetStream())
{
int bytesRead;
// Loop to receive all the data sent by the client.
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// Translate data bytes to a ASCII string.
data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
if ()//check length
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
stream.WriteAsync(byteData, 0, byteData.Length);
}
//other logic to receive data fast enough and happend in same millisecond
}
}client.Close();
一切都很好,“保持活动”消息也很好,除了少数情况下,我注意到客户说超时并且正在寻找可能发生这种情况的原因
从我的日志中发现
如果两个同步消息在同一毫秒(运行Asynch)收到并在同一毫秒也得到确认。客户端超时,但是根据我的日志,我看到两个线程在同一毫秒被接收和确认
但是所有其他时间一切都很好,并且这些情况也是随机发生的。为什么发生上述情况?为什么在应用程序按时发送消息后500ms内延迟接收消息
请分享您的见解