如何向服务器发送“hello”并回复“hi”?

时间:2011-04-08 01:54:04

标签: c# tcpclient tcpserver

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

俗气,无能为力,但在一次性一次性计划中诀窍:

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

但是,this is a great place to start,请查看Sockets类以进行正确的双向通信。