ReadLine()只读取一次

时间:2015-05-13 17:25:17

标签: c#

    private void btnServer_Click(object sender, EventArgs e)
    {
        TcpListener listen = new TcpListener(IPAddress.Any, 1237);
        listen.Start();
        client = listen.AcceptTcpClient();
        txtContent.Text = "Connected" + "\n";
        s = client.Client;
        str = new StreamReader(client.GetStream());
        stw = new StreamWriter(client.GetStream());
        stw.AutoFlush = true;

        backgroundWorker1.RunWorkerAsync();
        //backgroundWorker2.WorkerSupportsCancellation = true;


    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        client.Close();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        while (client.Connected)
        {
            try
            {
                while ((receive = str.ReadLine()) != null)
                {
                    txtContent.AppendText(receive + "\n");
                    receive = "";
                }
            }
            catch (Exception x)
            {
                MessageBox.Show(x.ToString());
            }
        }
    }
}

我希望程序监听请求,与客户端连接并接收客户端发送的所有数据。 我面临的问题:

  • 当客户端连接时间超过2秒时,我的服务器卡住了
  • Readline()仅读取设备发送的文本的第一行
  • 我完全不知道如何关闭连接作为client.Close()弹出异常。

我很乐意解决这些问题。关于这些问题的任何解释也将受到赞赏。

1 个答案:

答案 0 :(得分:1)

您希望从后台工作程序调用AcceptTcpClient,因此在等待客户端连接时,您的UI线程不会卡住。

你应该只调用一次GetStream();将结果保存为Stream对象,您可以从中获取读者和编写者。

你的后台工作人员不应该直接调用AppendText;它应该调用ReportProgress(0,text)。您无法从后台线程更新UI。 创建后台工作程序的方法应该将事件处理程序添加到更新文本的后台工作程序的ReportProgress事件中。该事件将在UI线程上运行。