gpt4 book ai didi

c# - C#连续套接字监听

转载 作者:行者123 更新时间:2023-12-03 11:58:09 24 4
gpt4 key购买 nike

我正在尝试设置一个服务器,该服务器连续读取通过端口传来的字符串。
我提出了一些代码,但是它只会读取一个字符串,然后停止。
我如何修改它,以便它连续读取到达该端口的字符串并将其放入文本框中?

我曾尝试放置一个“while(true)”,但这会挂断我的表单。我目前正在研究如何使套接字在backgroundWorker或Thread中监听。

public void start_server()
{
_server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_server_socket.Bind(new IPEndPoint(IPAddress.Any, 1234));
_server_socket.Listen(0);
_server_socket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}

private void AcceptCallback(IAsyncResult AR)
{
_client_socket = _server_socket.EndAccept(AR);
_buffer = new byte[_client_socket.ReceiveBufferSize];
_client_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}

private void ReceiveCallback(IAsyncResult AR)
{
string text = Encoding.ASCII.GetString(_buffer);
write(text);
}

private void write(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
textBox1.Text =textBox1.Text+text;
});
this.Invoke(invoker);
}

最佳答案

您需要在接收到第一部分后通过再次调用BeginReceive重新开始接收。
此外,您还缺少EndReceive,因此

  • 没有错误处理
  • 无法发现远程端是否关闭。
  • 不知道您实际收到了多少个字节(可能少于_buffer.Length)。

  • 它看起来应该像这样:
    private void ReceiveCallback(IAsyncResult AR)
    {
    try
    {
    int bytesTransferred = resultState.Socket.EndReceive(ar);
    if (bytesTransferred == 0) return; // Closed
    string text = Encoding.ASCII.GetString(_buffer, 0, bytesTransferred);
    write(text);

    // Read more
    _client_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    catch (Exception e)
    {
    // Error handling
    }

    }

    关于c# - C#连续套接字监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24181724/

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