StreamReader.ReadLine和CR

时间:2009-07-08 18:59:24

标签: c# .net vb.net sockets

我在这里密集吗? StreamReader.ReadLine声明:

  

一行被定义为字符序列,后跟换行符(“\ n”),回车符(“\ r”)或回车符后紧跟换行符号(“\ r \ n”) )

那么,为什么这不能按预期工作呢?

' Server
Dim tcpL as New TcpListener(IPAddress.Any, 5000)
tcpL.Start(1)
Using tcpC as TcpClient = tcpL.AcceptTcpClient(), _
s as NetworkStream = tcpC.GetStream(), _
sr as New StreamReader(s, System.Text.Encoding.ASCII, True)
   Dim message As String = sr.ReadLine()
   Console.WriteLine(message)
End Using
Console.ReadLine()

' Client
Using tcpC as New TcpClient()
  tcpC.Connect(IPAddress.Loopback, 5000)
  Using s as NetworkStream = tcpC.GetStream(), _
  sw as New StreamWriter(s, System.Text.Encoding.ASCII)
     sw.AutoFlush = True
     sw.Write("Hello there!")
     sw.Write(vbCR) ' Note the CR terminator
     Console.ReadLine()
  End Using
End Using

即使发送了CR,服务器也不会从ReadLine返回,直到断开连接。如果我更改为vbLFvbCRLF,它将按预期返回。

文档是错误的,还是我在这里搞砸了什么......?

1 个答案:

答案 0 :(得分:12)

ReadLine正等着看下一个角色是什么。如果它是换行符,它想要吞下它。如果你写任何其他字符给作家,那也会使它返回该行。

这是对线路终结器的历史混淆的一个不幸的必然结果。 TextReader要记住它需要潜在地吞下它读取的下一个字符(并立即返回该行),这可能更有意义了,但这就是生命。