Vb.net ReadLine似乎轮流处理连接和发送,导致了问题

Vb.net ReadLine似乎轮流处理连接和发送,导致了问题,vb.net,streamreader,Vb.net,Streamreader,我正在创建一个原始模式连接的服务器聊天功能,它处理多个连接,以便在我的大型应用程序中聊天调试消息。它使用StreamReader列表填充连接的读取流,以允许用户在调试器网络控制台上编写文本消息 我正在为下一个版本的应用程序实现聊天功能,这样连接的客户端就可以在应用程序运行期间就打印的调试消息进行聊天和评论 我正在使用.NET Framework 4.7.2上的Visual Studio 2019。我已经完成了聊天功能的编写,当第一个用户连接到调试器时,聊天看起来很好,因为每次他们按Enter键时

我正在创建一个原始模式连接的服务器聊天功能,它处理多个连接,以便在我的大型应用程序中聊天调试消息。它使用
StreamReader
列表填充连接的读取流,以允许用户在调试器网络控制台上编写文本消息

我正在为下一个版本的应用程序实现聊天功能,这样连接的客户端就可以在应用程序运行期间就打印的调试消息进行聊天和评论

我正在使用.NET Framework 4.7.2上的Visual Studio 2019。我已经完成了聊天功能的编写,当第一个用户连接到调试器时,聊天看起来很好,因为每次他们按Enter键时,都会出现关于它的调试消息,如下所示:

9/9/2019 5:57 PM (RemoteDebugger.vb:55): Debug device 192.168.1.105 connected.
Test
9/9/2019 5:57 PM (RemoteDebugger.vb:70): 192.168.1.105> Test
Test 2
9/9/2019 5:57 PM (RemoteDebugger.vb:70): 192.168.1.105> Test 2
Debugger test
9/9/2019 5:57 PM (RemoteDebugger.vb:70): 192.168.1.105> Debugger test
但是,随着时间的推移,用户将很好地连接到调试器,但是聊天功能似乎在第一个用户说话之前不适用于其他用户,因此其行为就像他们轮流发布消息一样

此外,当第二用户交谈一次或过多,并且第一用户反复按Enter键时,第二用户的消息似乎在第二次按Enter键或第二次发送消息之后出现

在进一步调试后,我发现
ReadLine
似乎被阻塞,此时它应该在不打印消息的情况下继续,并在下一个连接中转到另一个
StreamReader
,以允许消息正确传递。这意味着当我在
读线
断点后恢复程序时,它不会继续运行,直到检测到下一条消息,并且如果第二个用户尝试对话,断点将不会触发,直到第一个用户对话

为了澄清,以下是两个连接的输出:

  • 第一次连接:
  • 第二个连接:
在大型项目中用作聊天功能的代码如下:

Public DebugPort作为整数=3014
公共客户端作为套接字
作为TcpListener的公共调试TCP
公共调试设备作为新列表(套接字)
公共DBGCONS作为新列表(StreamWriter)
公共dbgChats作为新字典(StreamReader的字符串)
子StartRDebugThread()
如果是调试模式,则
使用{.IsBackground=True}将RDebugThread设置为新线程(StartRDebugger的地址)
RDebugThread.Start()
如果结束
端接头
子StartRdDebugger()
'侦听当前IP地址
DebugTCP=新的TcpListener(新的IPAddress({0,0,0}),DebugPort)
DebugTCP.Start()
Dim RStream作为新线程(ReadAndBroadcastAsync的地址)
RStream.Start()
W(DoTranslation(“使用端口{0}对所有地址进行调试侦听”),currentLang,True,ColTypes.Neutral,DebugPort)
而不是重新启动
尝试
将数据流设置为NetworkStream
将客户端设置为套接字
如果DebugTCP.Pending,则
RDebugClient=DebugTCP.AcceptSocket
RDebugStream=新网络流(RDebugClient)
添加(带有{.AutoFlush=True}的新StreamWriter(RDebugStream)
添加(新StreamReader(RDebugStream)、RDebugClient.RemoteEndPoint.ToString.Remove(RDebugClient.RemoteEndPoint.ToString.IndexOf(“:”))
DebugDevices.Add(RDebugClient)
Wdbg(“调试设备{0}已连接。”,RDebugClient.RemoteEndPoint.ToString.Remove(RDebugClient.RemoteEndPoint.ToString.IndexOf(“:”))
如果结束
特例
W(DoTranslation(“连接错误:{0}”,currentLang),True,ColTypes.Neutral,ex.Message)
结束尝试
结束时
DebugTCP.Stop()
dbgConns.Clear()
Thread.CurrentThread.Abort()
端接头
Sub ReadAndBroadcastAsync()
虽然是真的
对于i作为整数=0到dbgChats.Count-1
Dim msg As String=dbgChats.Keys(i).ReadLine()
Wdbg(“{0}>{1}”,dbgChats.Values(i),msg)
下一个
结束时
端接头

我能做什么?我还尝试了
readlinesync
函数等待它,但它没有改变任何东西。如果您需要任何进一步的信息,我会提供给您。

我最终修复了似乎轮流进行的聊天,将读取超时设置为读取前10毫秒

streamnet.ReadTimeout=10'似乎已将其修复
当读卡器超时时,它会生成一个异常,SocketErrorCode为ReadTimeout,因此我用Try..Catch块包围了读卡器及其周围的所有函数,构成:

试试看
streamnet.Read(buff,065536)
Dim msg As String=Text.Encoding.Default.GetString(buff)
msg=msg.Replace(vbCr,vbNullChar)'删除所有vbCr实例(macOS换行)}Windows主机也会受到影响,因为它使用
msg=msg.Replace(vbLf,vbNullChar)'Remove所有vbLf(Linux新行)}vbCrLf实例,意思是(vbCr+vbLf)
如果不是msg.StartsWith(vbNullChar),则Wdbg(“{0}>{1}”,ip,msg)”如果消息以空字符开头,则不发布消息。
特例
将SE设置为SocketException=CType(例如InnerException,SocketException)
如果不是Nothing(SE)且不是SE.SocketErrorCode=SocketError.TimedOut,则
Wdbg(“来自主机{0}:{1}的错误”,ip,SE.SocketErrorCode.ToString)
如果结束
结束尝试

因此,如果要使聊天服务器的客户端不以原始文本模式运行,请使用此选项。

您不能使用StreamReader。谷歌“vb.net聊天应用程序”来看看其他程序员是怎么做的,第一次点击应该很好。@HansPassant谢谢,但是为什么我不能使用NetworkStream的StreamReader呢?是因为效率很低吗?
9/9/2019 5:57 PM (RemoteDebugger.vb:55): Debug device 127.0.0.1 connected.
Hello
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> Hello
Test
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> Test
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Hello

9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> 
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Snja

9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> 
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Sinmue

9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> 
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Sona

9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> 

9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Mnjad
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> 
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> kodkw
fds
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> fds
9/9/2019 5:57 PM (RemoteDebugger.vb:55): Debug device 127.0.0.1 connected.
Hello
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> Hello
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> Test
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Hello
Snja
Sinmue
Sona
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105>
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Snja
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105>
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Sinmue
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105>
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Sona
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105>
Mnjad
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> Mnjad
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105>
kodkw
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 127.0.0.1> kodkw
9/9/2019 5:58 PM (RemoteDebugger.vb:70): 192.168.1.105> fds