2011-04-30 3 views
1

서버 응용 프로그램에서 두 번째 응답을 받아야합니다. 서버 응용 프로그램에 처음 연결할 때 회신을받습니다. 그러나 다른 메시지를 보내려고하면받을 수 없습니다.TcpClient 및 StreamReader를 사용하여 둘 이상의 메시지를받을 수 없습니다.

해결책을 찾으려고했지만 아무 것도 찾을 수 없습니다. 문제는 내 독자의 포인터가 아직 끝났다고 생각합니다. 그래서 다음 답장을 읽을 수 없습니다. 여기 내 코드입니다 :

public static void XConn() 
{ 
    TcpClient client = new TcpClient(); 
    client.Connect("xxx.xxx.xxx.xxx",xx); // i cant show the IP sorry 
    Stream s = client.GetStream(); 
    StreamReader sr = new StreamReader(s); 
    StreamWriter sw = new StreamWriter(s); 

    String r = ""; 
    sw.AutoFlush = true;  

    sw.WriteLine("CONNECT\nlogin:xxxxxxx \npasscode:xxxxxxx \n\n" + Convert.ToChar(0)); // cant show also 

    while(sr.Peek() >= 0) 
    { 
     r = sr.ReadLine(); 
     Console.WriteLine(r); 
     Debug.WriteLine(r); 
     if (r.ToString() == "") 
      break; 
    } 

    sr.DiscardBufferedData(); 

    //get data needed, sendMsg is a string containing the message i want to send 
    GetmsgType("1"); 
    sw.WriteLine(sendMsg); 

    // here i try to receive again the 2nd message but it fails =(
    while(sr.Peek() >= 0) 
    { 
     r = sr.ReadLine(); 
     Console.WriteLine(r); 
     Debug.WriteLine(r); 
     if (r.ToString() == "") 
      break; 
    } 

    s.Close(); 

    Console.WriteLine("ok"); 
} 
+0

어떤 프로토콜은 이것이다 : 당신이 정말로 시간 제한을 설정하거나 예외를 잡기에 대해 걱정할 필요가 없습니다 경우에도 작동 할 수 다음? –

+0

프로토콜? 너 무슨 뜻이야? 메시지가 전송되었다는 뜻입니까? –

+0

예 - 보내고받은 메시지의 지정된 형식은 무엇입니까? 그것은 CONNECT \ nlogin ... \ npassword ... \ n \ n \ 0으로되어 있습니까? 또한, 어떻게 실패하고 있습니까? 오류가 발생 했습니까? 아니면 아무 것도 인쇄되지 않습니다. –

답변

0

TcpClient.GetStream()NetworkStream를 반환, 그래서 당신은 독자 포인터를 변경할 수 없습니다 추구 지원하지 않으며, 한 연결이 열려있는, 그것은 하나, 말에 정말 결코 . 즉, StreamReader.Peek() 메서드는 응답 사이에 서버로부터 지연이있을 때 -1이라는 오도 된 코드를 반환 할 수 있습니다.

응답을 얻는 신뢰할 수있는 방법 중 하나는 읽기 타임 아웃을 설정하고 예외가 throw되어서 계속 수행 할 때까지 루핑을 유지하는 것입니다. 스트림은 여전히 ​​다른 메시지를 보낼 수 있습니다.

 s.ReadTimeout = 1000; 

     try 
     { 
      sw.WriteLine(sendMsg); 

      while(true) 
      { 
      r = sr.ReadLine(); 
      Console.WriteLine(r); 
      } 

     sr.DiscardBufferedData(); 
     } 
     catch(IOException) 
     { 
     //Timed out—probably no more to read 
     } 


UPDATE :

  while(true) 
     { 
      r = sr.ReadLine(); 
      Console.WriteLine(r); 
      if (sr.Peek() < 0) break; 
     } 
+0

아플 시도하십시오. 나중에 당신에게 피드백을주지. 설명을위한 감사합니다. 왜 그런 종류의 프로토콜을 가지고있는 이유는 STOMP의 요구 때문입니다. 그 중 하나에 연결 .. 처음에 내가 그때 SUBSCRIBE에 회신하려고하면 메시지 ... 내가 위의 게시 코드를 좋아해. 내가 메시지를 보내려고 할 때 (예를 들어, 나는 이름의 목록을 얻는다) 내 코드는 코드의이 부분을 막습니다. r = sr.ReadLine(); –

관련 문제