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");
}
}
我知道我发布的代码只是程序的一个片段,但它会占用相当多的空间,希望你能从中收集到我的意思,如果不是,我会发布更多。
这只是给我一个大概的想法,
我很感激你能给我的任何帮助/建议。它不是那么多的代码示例,我正在寻找(虽然有点帮助),但更多的一些解释流阅读器/作家,因为我似乎不能理解什么是在线。谢谢。
我想你只是缺少一个wr.flush();
,但这篇文章应该涵盖你需要的一切:
当您使用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()上捕获断点。