【问题标题】:UWP (VB.Net) StreamSocketListener not firing connected eventUWP(VB.Net)StreamSocketListener 未触发连接事件
【发布时间】:2017-08-01 21:19:45
【问题描述】:

我正在尝试在通用 Windows 平台应用程序中设置套接字侦听器。该应用程序将在 Raspberry PI 上运行,并监听来自动态秤的通信。

我在我的 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 和 false。当为 true 时,它​​会挂在处理程序中的 msgReceived = Await reader.ReadLineAsync() 上。我怀疑这是问题所在,但我发现的每个修复都没有任何区别。我唯一的另一个怀疑是不正确地使用 Async/Await,但我找不到太多信息来确认或否认这一点。 (我想我知道我在做什么,但我可能处于那种知道的程度足以造成危险......)

无论如何,任何输入将不胜感激。谢谢。

【问题讨论】:

  • 您确定电子秤发送 EOL(\n 或 \r 或 \r\n)HEX 13 和或 10 吗?我可以看到您的代码在等待秤永远不会发送的东西。 *仅供参考,我不确定您使用的是哪种秤,或者它的通话速度或您的应用程序的速度,但如果秤是连续进给的,这可能对您来说效果不佳,因为秤和所有部件这种方式会缓冲事物,并且在您处理此事件时(至少一段时间后)重量会消失
  • @Someonethatmatters 这很可能是问题所在。测试实用程序不会打印任何新行(尽管可以这样设计),我记得那个对秤进行编程的人问我们是否需要 EOL。我会调查的。至于规模:它有照片的眼睛。它在第一个通过时开始加权,并在第二个时停止。秤执行计算并将其发送到设定的 IP 地址(我的应用程序将在其中运行)。
  • @Someonethatmatters 这就是问题所在。如果你想回答,我会选择它作为答案。

标签: vb.net sockets uwp listener


【解决方案1】:

您确定电子秤发送 EOL(\n 或 \r 或 \r\n)HEX 13 和或 10 吗?我可以看到您的代码在等待秤永远不会发送的东西。 *仅供参考,我不确定您使用的是哪种秤,或者它的通话速度或您的应用程序的速度,但如果秤是连续进给的,这可能对您来说效果不佳,因为秤和所有部件这种方式会缓冲事物,并且在您处理此事件时(至少一段时间后)重量会消失

【讨论】: