2011-04-08 33 views
3

通过我的代码,我可以读取服务器上的消息并从客户端进行写入。但是我无法从服务器写入响应并读取客户端。如何向服务器发送“hello”并回复“hi”?

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(); 

代码代码在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(); 
} 

我怎样才能使读取数据,并读取该数据后,客户端服务器的回复?

回答

3

由于您使用

TcpClient client = tcpListener.AcceptTcpClient(); 

,你可以写回客户端直接内无需自我认同。 如果您使用Stream.Read().ReadLine()而不是.ReadToEnd(),您拥有的代码实际上可以工作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,请查看Sockets类以进行适当的双向通信。

相关问题