Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何发送一个";“你好”;发送至服务器并回复“回复”;你好;?_C#_Tcpclient_Tcpserver - Fatal编程技术网

C# 如何发送一个";“你好”;发送至服务器并回复“回复”;你好;?

C# 如何发送一个";“你好”;发送至服务器并回复“回复”;你好;?,c#,tcpclient,tcpserver,C#,Tcpclient,Tcpserver,通过我的代码,我可以在服务器上读取消息并从客户端写入。但是,我无法从服务器写入响应并在客户端读取 客户端上的代码 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("He

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

客户端上的代码

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();
服务器上的代码

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

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

俗气、不熟练,但一次性程序的技巧是:

  • 客户端:在流中,包括它希望从中接收响应的端口和IP地址
  • 客户端:为它创建一个侦听器 端口和IP
  • 服务器:读取端口/IP信息并 依次连接,然后发送回复 小溪
但是,请查看Socket类以获得正确的双向通信。

因为您正在使用

TcpClient client = tcpListener.AcceptTcpClient();
,您可以直接向客户回信,而无需客户自行识别如果您使用
Stream.Read()
.ReadLine()
而不是
.ReadToEnd()
,那么您拥有的代码实际上可以工作
ReadToEnd()
将在网络流上永久阻塞,直到流关闭。注意类似的问题,或从

ReadToEnd假定流 知道什么时候结束。对于 交互协议,其中 服务器仅在您请求时发送数据 对于它,不关闭 连接,ReadToEnd可能会阻塞 无限期地,因为它无法到达 结束,应该避免

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