2015-06-26 2 views
1

Я пытаюсь связаться с сервером.StreamReader - ReadLine из Socket не останавливается

Это мой простой код:

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(). Это не делает то, что я ожидаю от этого.

Он читает все строки с сервера, и после последней строки он просто бесконечно ждет новой строки. По крайней мере, для меня кажется, что он ждет.

Я думал, что он остановится после последней строки и вернет нуль или что-то еще.

Может кто-нибудь объяснить мне, что лучше всего, чтобы получить все линии с сервера и двигаться дальше?

+0

Поскольку поток, предоставляемый 'Socket.GetStream()', не может знать, когда сервер будет отправлен, 'StreamReader.ReadLine()' никогда не сможет сказать, когда он будет получен. – willaien

+1

Сервер должен отправить пустую строку после отправки содержимого (чтобы эта реализация работала) – Benj

ответ

0

Я решил так:

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 уже сказал, поток не знает, когда она закончится. Пока вы общаетесь с сервером, вы можете дождаться ответа.

Я положил код, который слушает сервер в фоновом рабочем столе, который всегда прослушивает и отправляет событие, когда появляется новый ответ.