【问题标题】:StreamReader - ReadLine from Socket doesn't stopStreamReader - 来自 Socket 的 ReadLine 不会停止
【发布时间】:2015-06-26 18:34:57
【问题描述】:

我正在尝试与服务器通信。

这是我的简单代码:

System.Net.Sockets.TcpClient sock = new System.Net.Sockets.TcpClient();
string outputString = string.Empty;
sock.Connect("stack.overflow", 80);

NetworkStream ns = null;
StreamReader sr = null;
StreamWriter sw = null;

ns = sock.GetStream();
sr = new StreamReader(ns);
sw = new StreamWriter(ns) { NewLine = "\r\n", AutoFlush = true };
ns.ReadTimeout = 10;
sw.WriteLine("send data to server");
sw.Flush();

outputString = sr.ReadLine();
while (!string.IsNullOrEmpty(outputString))
{
    System.Diagnostics.Debug.WriteLine(outputString);
    outputString = sr.ReadLine();
}

(我知道我的代码还有改进的空间。它让我的测试保持简单)

在 ReadLine() 旁边一切正常。 它没有做我期望它做的事情。

它从服务器读取所有行,并在最后一行之后无休止地等待新行。至少对我来说,它似乎在等待。

我以为它会在最后一行之后停止并返回 null 或其他内容。

谁能解释一下从服务器获取所有线路并继续前进的最佳做法是什么?

【问题讨论】:

  • 因为Socket.GetStream()提供的流无法知道服务器何时完成发送,StreamReader.ReadLine()永远无法知道它何时完成接收。
  • 服务器在发送内容后必须发送一个空字符串(这个实现才能工作)

标签: c# sockets tcpclient streamreader readline


【解决方案1】:

我是这样解决的:

public class ServerHandler
{
    private BackgroundWorker serverWorker = new BackgroundWorker();
    public event EventHandler ServerResponse;

    private TcpClient socket;
    private NetworkStream networkStream;
    private StreamReader streamReader;
    private StreamWriter streamWriter;

    public ServerHandler()
    {
        System.Net.Sockets.TcpClient sock = new System.Net.Sockets.TcpClient();

        serverWorker.WorkerSupportsCancellation = true;
        serverWorker.DoWork += new DoWorkEventHandler(serverWorker_DoWork);
    }

    public void ConnectToServer()
    {
        socket = new TcpClient();
        socket.Connect("stack.overflow", 80);

        networkStream = socket.GetStream();
        streamReader = new StreamReader(networkStream);
        streamWriter = new StreamWriter(networkStream) { NewLine = "\r\n", AutoFlush = true };

        SendMessage("some data");
    }

    public bool IsConnected
    {
        get { return socket.Connected; }
    }

    public void StartListening()
    {
        if (ServerResponse == null)
            throw new Exception("There is no event to intercept the response!");

        serverWorker.RunWorkerAsync();
    }

    private void SendMessage(string message)
    {
        streamWriter.WriteLine(message);
        streamWriter.Flush();
    }

    private void serverWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        while (true)
        {
            string serverResponse = streamReader.ReadLine();

            ServerResponse(serverResponse, new EventArgs());
        }
    }
}

就像 willaien 已经说过的那样,流不知道何时结束。只要您正在与服务器通信,您就可以等待响应。

我将侦听服务器的代码放在后台工作人员中,该工作人员始终进行侦听并在出现新响应时发送事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多