我试图在通用Windows平台应用程序中设置套接字侦听器。该应用将在Raspberry PI上运行,并通过动态范围内的通信进行收听。UWP(VB.Net)StreamSocketListener没有触发连接事件
我在我的mainVM文件中设置了一个StreamSocketListener。我有命令来启动和停止它。我已经在网上找到了我可以找到的少数指南,但是当尺度发送数据时它不会触发事件。我已经测试了一个我下载的侦听器应用程序,因此我可以确认邮件正在发送并且我的计算机能够接收它们(没有防火墙问题)。 (我也知道只有一个应用程序可以听一个端口,所以这个测试程序在测试我的程序时是关闭的。)
当第一次启动连接时,我会得到一个处理函数的命中,但我从来没有再一次。没有错误,只是没有发生。
命令:
Public Property cmdStart As New Command(Async Sub() Await StartListener(), True)
Public Property cmdStop As New Command(Sub() StopListener(), True)
命令子程序:
Private Async Function StopListener() As Task
If Connected Then
Await _prePriceListener.CancelIOAsync()
RemoveHandler _prePriceListener.ConnectionReceived, Nothing
_prePriceListener.Dispose()
Connected = False
End If
End Function
Private Async Function StartListener() As Task
If ValidateInput() Then
Try
_prePriceListener = New StreamSocketListener()
_prePriceListener.Control.KeepAlive = False
AddHandler _prePriceListener.ConnectionReceived, AddressOf HandlerReceived
Await _prePriceListener.BindServiceNameAsync("6021")
Connected = True
Catch ex As Exception
Message = ex.Message
End Try
End If
End Function
事件处理程序:
Private Async Function HandlerReceived(sender As StreamSocketListener, args As StreamSocketListenerConnectionReceivedEventArgs) As Task
Dim msgReceived As String = ""
Dim inStream As Stream
Dim reader As StreamReader
Try
inStream = args.Socket.InputStream.AsStreamForRead()
reader = New StreamReader(inStream)
Catch ex As Exception
Return
End Try
Try
If reader IsNot Nothing Then
msgReceived = Await reader.ReadLineAsync()
HandlePrepriceRead(msgReceived)
End If
Catch ex As Exception
Return
End Try
End Function
我试着_prePriceListener.Control.KeepAlive设置为两个真假。如果为true,则挂起msgReceived =等待处理程序中的reader.ReadLineAsync()。我怀疑这是问题,但我发现每一个修复都没有什么不同。我唯一的怀疑是Async/Await的使用不正确,但我无法找到许多信息来确认或否认这一点。 (我想我知道我在做什么,但我可能处于知道程度就足够危险......)
无论如何,任何输入将不胜感激。谢谢。
你确定该比例发送一个EOL(\ n或\ r或\ r \ n)十六进制13和10?我可以看到你的代码在等待一个规模永远不会发送的东西。 *仅供参考我不确定你正在使用什么样的规模,或者它说话或你的应用程序的速度如何,但如果规模是连续的饲料,这可能不会很好地作为您的规模和所有部分这种方式将缓冲的事情和重量将消失,当你处理这个事件(过了一会儿atleast) –
@Someonethatmatters这可能是非常好的问题。测试实用程序不会打印任何新行(尽管可以这样设计),并且我记得编写规模的人问我们是否需要EOL。我会研究一下。至于规模:它有照片眼睛。当第一个通过时停止,第二个停止。秤执行计算并将其发送到设置的IP地址(我的应用程序将运行的地方)。 – sjoachim
@Someonethatmatters这是问题。如果你想回答它,我会选择它作为答案。 – sjoachim