2017-08-01 88 views
0

我试图在通用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的使用不正确,但我无法找到许多信息来确认或否认这一点。 (我想我知道我在做什么,但我可能处于知道程度就足够危险......)

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

+0

你确定该比例发送一个EOL(\ n或\ r或\ r \ n)十六进制13和10?我可以看到你的代码在等待一个规模永远不会发送的东西。 *仅供参考我不确定你正在使用什么样的规模,或者它说话或你的应用程序的速度如何,但如果规模是连续的饲料,这可能不会很好地作为您的规模和所有部分这种方式将缓冲的事情和重量将消失,当你处理这个事件(过了一会儿atleast) –

+0

@Someonethatmatters这可能是非常好的问题。测试实用程序不会打印任何新行(尽管可以这样设计),并且我记得编写规模的人问我们是否需要EOL。我会研究一下。至于规模:它有照片眼睛。当第一个通过时停止,第二个停止。秤执行计算并将其发送到设置的IP地址(我的应用程序将运行的地方)。 – sjoachim

+0

@Someonethatmatters这是问题。如果你想回答它,我会选择它作为答案。 – sjoachim

回答

0

您确定秤正在发送EOL(\ n或\ r或\ r \ n)HEX 13和or 10吗?我可以看到你的代码在等待一个规模永远不会发送的东西。 *仅供参考我不确定你正在使用什么样的规模,或者它说话或你的应用程序的速度如何,但如果规模是连续的饲料,这可能不会很好地作为您的规模和所有部分这种方式将缓冲的东西和重量将消失的时间,你处理这个事件(一段时间后至少)