2011-04-08 3 views
3

내 코드를 사용하여 서버에서 메시지를 읽고 클라이언트에서 쓸 수 있습니다. 하지만 서버에서 응답을 작성하고 클라이언트에서 읽을 수는 없습니다."hello"를 서버에 보내고 "hi"를 회신하려면 어떻게해야합니까?

나는이 데이터를 읽을 클라이언트의 데이터를 읽고 한 후 서버 응답을 할 수 어떻게 server

tcpListener = new TcpListener(IPAddress.Any, port); 
tcpListener.Start(); 

while (run) 
{ 
    var client = tcpListener.AcceptTcpClient(); 

    string data = String.Empty; 

    using (var ns = client.GetStream()) 
    { 
     using (var sr = new StreamReader(ns)) 
     { 
      data = sr.ReadToEnd(); 

      //using (var sw = new StreamWriter(ns)) 
      //{ 
      // sw.WriteLine("Hi"); 
      // sw.Flush(); 
      //} 
     } 
    } 
    client.Close(); 
} 

client

var cli = new TcpClient(); 

cli.Connect("127.0.0.1", 6800); 

string data = String.Empty; 

using (var ns = cli.GetStream()) 
{ 
    using (var sw = new StreamWriter(ns)) 
    { 
     sw.Write("Hello"); 
     sw.Flush(); 

     //using (var sr = new StreamReader(ns)) 
     //{ 
     // data = sr.ReadToEnd(); 
     //} 
    } 
} 

cli.Close(); 

코드의 코드?

답변

3

당신이

TcpClient client = tcpListener.AcceptTcpClient(); 

을 사용하고 있기 때문에, 직접 자기 확인에 필요없이 클라이언트로 다시 쓸 수 있습니다. .ReadToEnd() 대신 또는 .ReadLine()을 사용하는 경우 실제로 사용하는 코드는입니다. ReadToEnd()은 스트림이 닫힐 때까지 네트워크 스트림에서 영원히 차단됩니다. 비슷한 질문에 this answer를 참조하거나, MSDN에서

ReadToEnd는 끝을 도달하면 스트림 알고 있다고 가정합니다. 서버가 그것을 위해 을 요청하고 연결을 종료하지 않는 경우가 끝을 에 도달하지 않고, 피해야하기 때문에 만 ReadToEnd 무기한 를 차단할 수있는 데이터를 전송하는 대화 형 프로토콜하십시오.

한 쪽에서 ReadLine()을 사용하는 경우 다른 쪽에서 WriteLine() - Write() -를 사용해야합니다. 대안은 아무것도 남지 않을 때까지 Stream.Read()를 호출하는 루프를 사용하는 것입니다. AcceptTcpClient() documentation on MSDN에서 서버 측에 대한 전체 예제를 볼 수 있습니다. 해당 클라이언트 예제는 TcpClient documentation에 있습니다.

0

치즈 맛이 나는, inneficient,하지만 한 번 쓰고 버리는 프로그램에 트릭을 수행합니다

  • 클라이언트 : 스트림에서 포트를 포함하고 IP는에서 응답을 수신하고자 해결합니다.
  • 클라이언트 : 해당 포트 및 IP에 대한 수신기를 만듭니다.
  • 서버 : 포트/IP 정보를 읽고 을 차례로 연결 한 다음 스트림을 보내십시오.

그러나 this is a great place to start은 올바른 양방향 통신을 위해 소켓 클래스를 조사합니다.

관련 문제