gpt4 book ai didi

C# - 服务器套接字不检索数据

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:56 25 4
gpt4 key购买 nike

我的问题是当我的客户端发送数据时,我的服务器只在第一个发送的消息中获取它。服务器未收到所有后续客户端消息。如果我调试客户端,它不会抛出任何异常,所以我认为问题出在服务器的接受上。

谁能告诉我如何修复我的客户端能够多次发送到服务器而无需为每条消息创建新套接字(在客户端上)的代码?

服务器:

        static Socket connection;
static IPEndPoint endpoint;
const int BUFFER_SIZE = 1024;
static byte[] buffer;
static void Main(string[] args)
{
connection = new Socket(SocketType.Stream, ProtocolType.Tcp);
endpoint = new IPEndPoint(IPAddress.Any, 1337);
connection.Bind(endpoint);
connection.Listen(10);
buffer = new byte[BUFFER_SIZE];

connection.BeginAccept(new AsyncCallback(AsyncAccept),null);
Console.ReadLine();
}

private static void AsyncAccept(IAsyncResult ar)
{
Socket s = connection.EndAccept(ar);
s.BeginReceive(buffer,0,BUFFER_SIZE, SocketFlags.None, new AsyncCallback(AsyncReceive),s);
connection.BeginAccept(new AsyncCallback(AsyncAccept), null);
}

static void AsyncReceive(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
int received = s.EndReceive(ar); //END
byte[] data = new byte[received];
Array.Copy(buffer, data, received);

string text = Encoding.Default.GetString(data);
Console.WriteLine(text);

}

客户:

    Socket c;
IPEndPoint endpoint;
string text;

public MainWindow()
{
InitializeComponent();
c = new Socket(SocketType.Stream, ProtocolType.Tcp);
endpoint = new IPEndPoint(IPAddress.Loopback, 1337);
c.Connect(endpoint);
}


private void Send()
{
byte[] buffer = Encoding.Default.GetBytes(text);
c.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendAsync), c);
}

private void SendAsync(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
s.EndSend(ar);
}

private void btnSend_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(Send);
text = txtMessage.Text;
t.IsBackground = true;
t.Start();
}

最佳答案

您需要在您的 AsyncReceive 处理程序中启动另一个 BeginReceive。最初的异步接收已完成 - 您只会得到您要求的一个响应。

此外,在谈论 TCP 时不要考虑消息 - 它是一种基于流的协议(protocol),没有消息。如果您想通过 TCP 发送(和接收)消息,您需要在 TCP 之上实现您自己的消息协议(protocol)。

我建议多读一些关于网络(以及一般的异步 I/O)是如何工作的——就像多线程一样,很容易得到大部分工作的东西,但不可能正确地调试和修复.最简单的例子是您将 TCP 视为基于消息的协议(protocol) - 它往往主要在本地主机和非常受限的网络条件下工作,但它并不安全,而且会在您面前爆炸。

关于C# - 服务器套接字不检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702306/

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