2014-06-12 136 views
1

我试图设置一个连续读取通过端口来的字符串的服务器。 我已经找到了一段代码,但它只会读取一个字符串,然后停止。 我该如何修改它,以便连续读取到达该端口的字符串并将它们放入文本框?C#连续套接字侦听

我试过放一个“while(true)”,但这会挂起我的form.I当前正在研究如何使套接字在backgroundWorker或线程中侦听。

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); 
    } 
+1

你需要开始在你的'ReceiveCallback'方法再次接收。 –

回答

3

您需要重新接收第一部分后再次调用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     
     } 

} 
+2

我会使用两个独立的try/catch来保证即使EndReceive或缓冲区处理失败,也会调用下一个'BeginReceive()'。 – jgauffin

+0

我想过了,但这取决于你的意图;)如果EndReceive失败,套接字最有可能关闭或处于错误状态,下一次接收也会失败。所以你可能会建立一个无尽的呼叫循环。在这个例子中'GetString'和'write'不应该抛出任何东西。使用传入数据的 – Matthias247

+0

不应该破坏接收周期 – jgauffin