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