gpt4 book ai didi

c# - C#套接字服务器无法多次从同一客户端连接接收数据

转载 作者:行者123 更新时间:2023-12-03 12:06:41 26 4
gpt4 key购买 nike

我最近问了一个相关问题In C# how do I have a socket continue to stay open and accept new data?并在某种程度上解决了这个问题,但是现在我很难让我的服务器不止一次从同一客户端接收数据。

我已经在VS中使用Windows窗体编写了一个简单的套接字服务器,该服务器具有一个调用接收函数的按钮

public void Receive()
{
try
{
byte[] bytes = new byte[256];
received = s1.Accept().Receive(bytes);
receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
return;
}
}

如果我是第一次从客户端发送邮件,它会起作用,但是如果我尝试发送其他邮件,然后单击“接收”,我的服务器只会循环,并且永远不会拾取新数据。但是,如果我从其他地方发送,或者从客户端重新启动连接,则可以发送数据。

我希望服务器能够一次从同一客户端接收任何数量的数据。请询问您是否需要更多代码/细节。不确定什么是相关的,因为我是套接字编程的新手。

最佳答案

每个客户端只能调用一次Accept(),而不是每次您想要接收新数据时都调用一次。 Accept()基本上等待客户端连接到服务器套接字s1(并返回新的套接字以与此客户端发送/接收数据),因此在这里每次调用Receive()函数时,套接字都会等待另一个客户端进行连接连接,这就是为什么它只能运行一次的原因。

这是一个示例(代码来自您先前的问题):

s1.Bind(endP);
s1.Listen(10);
Socket s2 = s1.Accept(); // Waits for a client to connect and return a socket, s2, to communicate with him
while (true) {
Receive(s2);
}
...

Receive()函数:
public void Receive(Socket s)
{
try
{
byte[] bytes = new byte[256];
received = s.Receive(bytes);
receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
return;
}
}

关于c# - C#套接字服务器无法多次从同一客户端连接接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com