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#套接字读取数据,然后应答_C#_Sockets_Tcp - Fatal编程技术网

c#套接字读取数据,然后应答

c#套接字读取数据,然后应答,c#,sockets,tcp,C#,Sockets,Tcp,我正在使用以下代码(根据我之前的问题答案构建): 行“Do work”表示我将在哪里为我的客户执行所需的处理 然而,我不知道如何使用这段代码读取客户机的数据,然后回复它。当使用此代码时,我可以完全读取客户端发送的内容,但是一旦发生这种情况,客户端就会锁定并最终抱怨连接被终止。它没有收到我的答复 有没有办法解决这个问题?我想你应该用一个长度字节来分配你的缓冲区。ReceiveBufferSize可以被多次调用,我认为不能保证您在一个块中接收所有内容。好的,首先,您混合了异步调用(BeginAcce

我正在使用以下代码(根据我之前的问题答案构建):

行“Do work”表示我将在哪里为我的客户执行所需的处理

然而,我不知道如何使用这段代码读取客户机的数据,然后回复它。当使用此代码时,我可以完全读取客户端发送的内容,但是一旦发生这种情况,客户端就会锁定并最终抱怨连接被终止。它没有收到我的答复


有没有办法解决这个问题?

我想你应该用一个长度字节来分配你的缓冲区。ReceiveBufferSize可以被多次调用,我认为不能保证您在一个块中接收所有内容。

好的,首先,您混合了异步调用(
BeginAcceptTcpClient
)和同步调用(
读取
写入
)。这完全破坏了异步代码的用途。第二,也许这就是你的插座被关闭的原因?在异步套接字上执行同步操作。我不确定,但如果没有客户端代码,就无法判断

无论如何,这不是构建异步多客户端服务器的方式


这里是一个完全异步的服务器实现:

您误解了
读取的工作原理。它会一直阻塞,直到从另一个端点接收到某些内容。它返回0的唯一时间是另一端断开连接时,因此您将继续读取,直到另一端断开连接


使用TCP时,您需要知道消息何时结束。您可以先将消息长度作为标题发送,也可以在每条消息之后使用后缀(作为换行符)。然后您应该继续阅读,直到完整的消息到达。

客户机是否正在侦听回复?您确定在写入服务器后没有关闭客户端的流吗?客户端使用System.Net.Sockets.Socket。它使用Send()方法发送数据字符串。然后它直接定义一个字符串[]来保存接收到的数据,并在同一套接字上调用Receive()来读取响应。-1。没有同步或异步套接字。只需执行IO的同步和异步方法。你可以毫无问题地混在一起。此解决方案非常适合使用,而不是为每个客户端创建一个线程(这要归功于.Net线程池)
public void Start()
{
    listener = new TcpListener(IPAddress.Any, 9030);
    listener.Start();
    Console.WriteLine("Listening...");
    StartAccept();
}

private void StartAccept()
{        
    listener.BeginAcceptTcpClient(HandleAsyncConnection, listener);            
}

private void HandleAsyncConnection(IAsyncResult res)
{
    StartAccept();
    TcpClient client = listener.EndAcceptTcpClient(res);

    StringBuilder sb = new StringBuilder();
    var data = new byte[client.ReceiveBufferSize];

    using (NetworkStream ns = client.GetStream())
    {
        int readCount;
        while ((readCount = ns.Read(data, 0, client.ReceiveBufferSize)) != 0)
        {
            sb.Append(Encoding.UTF8.GetString(data, 0, readCount));
        }

        // Do work

        // Test reply
        Byte[] replyData = System.Text.Encoding.ASCII.GetBytes(DateTime.Now.ToString());
        ns.Write(replyData, 0, replyData.Length);
        ns.Flush();
        ns.Close();
    }

    client.Close();
}