3

使用我的代码,我可以在服务器上读取消息并从客户端写入。但我无法从服务器写入响应并在客户端读取。

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

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

4

2 回答 2

3

由于您正在使用

TcpClient client = tcpListener.AcceptTcpClient();

,您可以直接回写给客户端,不需要它进行自我识别。 如果您使用or代替. 将永远阻塞在网络流上,直到流关闭。请参阅对类似问题或来自MSDN的此答案Stream.Read().ReadLine().ReadToEnd()ReadToEnd()

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

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

于 2011-04-08T03:14:43.823 回答
0

俗气的,无能的,但在一次性一次性程序中发挥了作用:

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

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

于 2011-04-08T02:35:59.927 回答