如何向服务器发送“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(); } 

如何在读取数据后让服务器回复并让客户端读取此数据?

因为你正在使用

 TcpClient client = tcpListener.AcceptTcpClient(); 

,您可以直接回写客户端而无需自我识别。 如果您使用Stream.Read().ReadLine()而不是.ReadToEnd()那么您拥有的代码将实际工作ReadToEnd()将永久阻塞网络流,直到流关闭。 查看类似问题的答案 ,或者从MSDN ,

ReadToEnd假定流知道它何时到达终点。 对于服务器仅在您请求数据并且不关闭连接时才发送数据的交互式协议,ReadToEnd可能会无限期地阻塞,因为它没有达到目的,应该避免。

如果在一侧使用ReadLine(),则需要在另一侧使用WriteLine()而不是Write()。 另一种方法是使用一个调用Stream.Read()的循环,直到没有东西可以读取。 您可以在MSDN上的AcceptTcpClient()文档中看到服务器端的完整示例。 相应的客户端示例位于TcpClient文档中 。

Cheesy,inneficient,但在一次性一次性计划中诀窍:

  • 客户端:在流中,包括它希望从中接收响应的端口和IP地址。
  • 客户端:为该端口和IP创建一个侦听器。
  • 服务器:读入端口/ IP信息然后连接,然后发送回复流。

但是, 这是一个很好的起点 ,请查看Sockets类以进行适当的双向通信。