Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步TCP客户端/服务器问题_C#_.net_Asynchronous_Tcp_Server - Fatal编程技术网

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”,因为我认为它与那个特定的客户机相关。