如何发送"hello"发送和回复一个“你好”

本文关键字:quot 一个 你好 hello 何发送 回复 | 更新日期: 2023-09-27 17:49:31

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

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

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

如何发送"hello"发送和回复一个“你好”

既然你在使用

TcpClient client = tcpListener.AcceptTcpClient();

,您可以直接写回客户端,而不需要它自我识别。如果您使用Stream.Read().ReadLine()而不是.ReadToEnd(),您拥有的代码将实际工作ReadToEnd()将永远阻塞网络流,直到流被关闭。参见对类似问题的回答,或来自MSDN,

ReadToEnd假定流知道什么时候结束。为的交互式协议服务器只在您请求时发送数据为它而不关闭连接,ReadToEnd可能会阻塞无限,因为它没有到达结束,应避免使用。

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

俗气,低效,但在一次性丢弃的程序中很有用:

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

然而,这是一个很好的开始,查看Sockets类以获得正确的双向通信。