c#客户端/服务器:使用流阅读器/写入器

本文关键字:客户端 服务器 | 更新日期: 2023-09-27 17:54:00

我对c#比较陌生,但这里是:

我正在开发一个远程文件服务客户端/服务器控制台应用程序在c#应该使用同步套接字交换消息。

其中一个主要问题(即使看起来很简单)是从服务器返回一个字符串,使用streamreader/streamwriter返回给客户端。

应用程序用户使用带有选项(来自switch语句)的命令行接口来执行操作。例如,输入1和enter将执行代码,将字符串从服务器发送到客户端。

下面是客户端的示例代码:
        try
        {
            using (TcpClient client = (TcpClient)clientObject)
            using (NetworkStream stream = client.GetStream())
            using (StreamReader rd = new StreamReader(stream))
            using (StreamWriter wr = new StreamWriter(stream))
            {
                string menuOption = rd.ReadLine();

                switch (menuOption)
                    {
                        case "1":
                        case "one":
                            string passToClient = "Test Message!";
                            wr.WriteLine(passToClient);
                            break;
                   } 
                      while (menuOption != "4");
               }
         }

我知道我发布的代码只是程序的一个片段,但它会占用相当多的空间,希望你能从中收集到我的意思,如果不是,我会发布更多。

这只是给我一个大概的想法,

我很感激你能给我的任何帮助/建议。它不是那么多的代码示例,我正在寻找(虽然有点帮助),但更多的一些解释流阅读器/作家,因为我似乎不能理解什么是在线。

谢谢。

c#客户端/服务器:使用流阅读器/写入器

我想你只是缺少一个wr.flush();,但这篇文章应该涵盖你需要的一切:

http://thuruinhttp.wordpress.com/2012/01/07/simple-clientserver-in-c/

当您使用StreamWriter时,您需要Flush()流的内容。我将引用MSDN,因为原因非常清楚:

清除当前写入器的所有缓冲区,并将所有缓存的数据写入底层流。

你可以简单地把它命名为:

wr.flush();

解决方案可以更简单:

StreamWriter wr = new StreamWriter(stream) { AutoFlush = true }

我刚刚用你的代码运行了一个测试,它工作得很好,我可以直接进入"one" case语句。

我猜你要么不包括你正在发送的字符串的换行符,或者你只是有TcpClient或TcpListener配置错误。

下面是我测试的客户端代码:
        TcpClient client = new TcpClient("127.0.0.1", 13579);
        string message = "one" + Environment.NewLine;
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
        NetworkStream stream = client.GetStream();
        stream.Write(data, 0, data.Length);

服务器端:

        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
        TcpListener server = new TcpListener(localAddr, 13579);
        server.Start();
        TcpClient client = server.AcceptTcpClient();
        using (client)
        using (NetworkStream stream = client.GetStream())
        using (StreamReader rd = new StreamReader(stream))
        using (StreamWriter wr = new StreamWriter(stream))
        {
            string menuOption = rd.ReadLine();
            switch (menuOption)
            {
                case "1":
                case "one":
                    string passToClient = "Test Message!";
                    wr.WriteLine(passToClient);
                    break;
            }
            while (menuOption != "4") ;
        }

首先运行服务器端代码,它将在等待连接时阻塞,然后在等待数据时阻塞。然后运行客户端代码。您应该能够在switch()上捕获断点。