C# 异步TCP客户端/服务器问题
我在连接客户端时调用了此服务器方法:C# 异步TCP客户端/服务器问题,c#,.net,asynchronous,tcp,server,C#,.net,Asynchronous,Tcp,Server,我在连接客户端时调用了此服务器方法: class Server { protected override void clientIn(TcpClient client)//Called when a Client comes in { NetworkStream stream = client.GetStream(); byte[] y = new byte[client.ReceiveBufferSize]; objectStat
class Server {
protected override void clientIn(TcpClient client)//Called when a Client comes in
{
NetworkStream stream = client.GetStream();
byte[] y = new byte[client.ReceiveBufferSize];
objectState state = new objectState();
state.buffer = y;
state.user = client;
stream.BeginRead(y, 0, y.Length, read, state);
}
public void read(IAsyncResult ar)
{
Console.WriteLine("GetData");
objectState state = (objectState)ar.AsyncState;
byte[] buffer = state.buffer;
TcpClient client = state.user;
int byte=client.GetStream().EndRead(ar);
client.GetStream().BeginRead(buffer, 0, client.ReceiveBufferSize, read, state);
String text = Encoding.ASCII.GetString(buffer);
Console.WriteLine(text);
}
}
class objectState
{
public TcpClient user;
public byte[] buffer;
}
我从两个不同的客户端发送两个数据,我的问题是:
如果我不执行指令“Console.WriteLine(text);”,那么在Console中,我会得到2倍的消息“GetData”(这意味着我从2个客户端获得数据)
但如果我执行指令“Console.WriteLine(text);”,在控制台中,我会得到消息“GetData”的1倍,低于刚刚得到的数据。这是第一个客户的数据,第二个客户的数据丢失了,但我不明白为什么
你能帮我吗
谢谢你抽出时间
更新:
我以这种方式编辑了代码,效果很好,但我不明白为什么:
protected override void clientIn(TcpClient client)
{
objectState state = new objectState();
state.user = client;
state.buffer= new byte[client.ReceiveBufferSize];
client.Client.BeginReceive(state.buffer, 0, client.ReceiveBufferSize, 0, new AsyncCallback(read), state);
}
public void read(IAsyncResult ar)
{
Console.WriteLine("GetData");
objectState state = (objectState)ar.AsyncState;
TcpClient client = stato.user;
int dataSize = client.Client.EndReceive(ar);
String data = "";
data = Encoding.ASCII.GetString(state.buffer, 0,dataSize);
Console.WriteLine("\n "+data);
client.Client.BeginReceive(stato.buffer, 0, client.ReceiveBufferSize, 0, new AsyncCallback(read), state);
}
我不明白以前哪里错了
更新2:
public void read(IAsyncResult ar)
{
Console.WriteLine("GetData");
objectState state = (objectState)ar.AsyncState;
byte[] buffer = state.buffer;
TcpClient client = state.user;
int dataSize=client.GetStream().EndRead(ar);
String text = Encoding.ASCII.GetString(buffer);
state.buffer = new byte[client.ReceiveBufferSize];//new buffer
client.GetStream().BeginRead(state.buffer, 0, client.ReceiveBufferSize, read, state);
Console.WriteLine(text);
}
我无法帮助您解决bug,但我注意到您在处理所读内容之前再次调用了
BeginRead
。由于您只使用单一状态,这意味着您的缓冲区可能会被后续读取操作损坏。我将首先处理缓冲区,然后开始新的读取操作。我尝试按照您的建议执行操作,但问题仍然存在。当您说“您仅使用一个状态”时,您是什么意思?您将在下一个开始时重新使用状态
对象。例如,在同一个缓冲区上调用ASCII.GetString
时,您可能会覆盖缓冲区
。也许我不太了解C#.NET中的异步服务器/客户端。我只使用state对象,因为我认为当客户端进入时,系统会为每个客户端执行方法“clientIn”,然后为每个客户端创建不同的“objectState”,然后为每个客户端开始读取。当一个客户机发送数据时,系统执行read方法,然后对于那个特定的客户机,我再次开始读取数据,因此在“read”方法中,当我调用“BeginRead”时,我通过“IAsyncResult”传递我在输入中得到的“objectState”,因为我认为它与那个特定的客户机相关。