Ale*_*yna 11 .net c# readline streamreader bufferedstream
简单地说,我一直在努力实现BufferedStreamReaderJava中的功能.我打开了一个套接字流,只想逐行地逐行读取它.
我有以下服务器代码.
while (continueProcess)
{
try
{
StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8);
string command = reader.ReadLine();
if (command == null)
break;
OnClientExecute(command);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
以下客户端代码:
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect("localhost", serverPort);
StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
writer.AutoFlush = true;
writer.WriteLine("login>user,pass");
writer.WriteLine("print>param1,param2,param3");
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
tcpClient.Close();
}
Run Code Online (Sandbox Code Playgroud)
服务器只读取第一行(login>user,pass)然后ReadLine返回null!
实现这种面向行的读者的最简单方法是什么,就像在Java中一样BufferedStreamReader?:■
Mar*_*ell 14
典型的线路阅读器类似于:
using(StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8)) {
string line;
while((line = reader.ReadLine()) != null) {
// do something with line
}
}
Run Code Online (Sandbox Code Playgroud)
(请注意,即使我们收到错误,using也要保证我们Dispose()的循环)
如果需要,可以使用迭代器块抽象(关注点分离):
static IEnumerable<string> ReadLines(Stream source, Encoding encoding) {
using(StreamReader reader = new StreamReader(source, encoding)) {
string line;
while((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
Run Code Online (Sandbox Code Playgroud)
(注意我们已将其移动到一个函数中并删除了"do something",将其替换为"yield return",这将创建一个迭代器(一个延迟迭代的非缓冲状态机)
然后我们将其简单地用作:
foreach(string line in ReadLines(Socket.GetStream(), Encoding.UTF8)) {
// do something with line
}
Run Code Online (Sandbox Code Playgroud)
现在我们的处理代码不需要担心如何读取行 - 只需给出一系列行,用它们做一些事情.
注意using(Dispose())也适用TcpClient; 你应该养成检查的习惯IDisposable; 例如(仍然包括您的错误记录):
using(TcpClient tcpClient = new TcpClient()) {
try {
tcpClient.Connect("localhost", serverPort);
StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
writer.AutoFlush = true;
writer.WriteLine("login>user,pass");
writer.WriteLine("print>param1,param2,param3");
} catch (Exception ex) {
Console.Error.WriteLine(ex.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
服务器代码中的while设置为每个连接只读取一行.在尝试读取所有发送的行时,您将需要另一个.我想一旦在客户端设置了该流,它将发送所有数据.然后在服务器端,您的流实际上只从该特定流中读取一行.
| 归档时间: |
|
| 查看次数: |
30833 次 |
| 最近记录: |