StreamReader.ReadLine和CR

Mar*_*ett 2 .net c# sockets vb.net

我在这里很密集吗?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
Run Code Online (Sandbox Code Playgroud)

ReadLine即使发送了CR ,服务器也不会在断开连接之前返回.如果我改为a vbLF,或者vbCRLF它会按预期返回.

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

Jon*_*eet 12

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

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

  • 至少,文档应该更加关于这个怪癖. (3认同)
  • 啊 - 很有道理,但也完全没用 - 因为消息以 CR 结尾,所以没有更多数据要发送。 (2认同)