C#连续套接字侦听

C#连续套接字侦听,c#,sockets,C#,Sockets,我正在尝试设置一个服务器,它可以连续读取通过端口发送的字符串。 我找到了一些代码,但它只会读取一个字符串,然后停止。 我如何修改它,使它能够连续读取到达该端口的字符串并将其放入文本框 我试着输入一个“while(true)”,但这会挂断我的表单。我目前正在研究如何让套接字在后台工作人员或线程中侦听 public void start_server() { _server_socket = new Socket(AddressFamily.InterNetwork,

我正在尝试设置一个服务器,它可以连续读取通过端口发送的字符串。 我找到了一些代码,但它只会读取一个字符串,然后停止。 我如何修改它,使它能够连续读取到达该端口的字符串并将其放入文本框

我试着输入一个“while(true)”,但这会挂断我的表单。我目前正在研究如何让套接字在后台工作人员或线程中侦听

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
,因此

  • 没有错误处理
  • 无法发现远程端是否已关闭
  • 不知道实际接收的字节数(可以小于
    \u 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                  
        }

}

您需要在
ReceiveCallback
方法中再次开始接收。我会使用两个单独的try/catch来保证下一个
BeginReceive()
被调用,即使
EndReceive
或缓冲区处理失败。我考虑过了,但这取决于您的意图;)如果
EndReceive
失败,则套接字很可能已关闭或处于错误状态,下一次接收也将失败。因此,您可能会建立一个没完没了的失败调用循环。本例中的
GetString
write
不应抛出任何内容。处理传入数据不应中断接收周期