【问题标题】:vb.net 2010 Sockets suddenly stopping?vb.net 2010 套接字突然停止?
【发布时间】:2013-05-27 23:01:46
【问题描述】:

我目前正在 vb.net 2010 中创建一个多客户端服务器应用程序。我正在使用套接字和网络流来读取数据。

很难解释正在发生的事情,而且发布代码可能对我的项目规模没有多大好处。但是,我将简要介绍一下我在做什么,然后会发生什么,希望有人可以帮助我,或者给我一些关于可能发生的事情的想法:)。

我启动服务器和客户端,它们都异步连接和侦听。在我的客户端中,我输入登录信息并使用网络流将其发送到服务器。服务器读取一切正常,再次开始监听,处理数据,向客户端发送帐户信息,表示客户端已连接,然后在处理完数据后随机关闭并退出该功能。发生这种情况时,客户端正在接收数据,再次开始侦听,处理数据,表示套接字已连接,然后一旦一切完成,函数完成后随机关闭。

现在我已经确保其他代码不会影响套接字,并将所有不需要的内容注释掉,并允许服务器和客户端继续循环。 (创建一个游戏,因此有一个 serverloop 和 gameloop)它似乎完成了所有工作,然后退出了阅读子,并停止收听更多阅读。

如果有人有任何想法,将不胜感激。提前致谢!

两边的代码都是一样的:

接收数据:

    Private Sub ReceiveOneByte(ByVal ar As IAsyncResult)
    Dim netStream As NetworkStream
    Dim InData() As Byte
    Dim DataLen(3) As Byte
    Dim inLength As Integer
    Dim Buffer As New clsBuffer
    Dim MsgType As Integer
    Dim NewData() As Byte
    Dim Empty() As Byte

    SyncLock Client_TCP.Client
        Try
            netStream = New NetworkStream(Client_TCP.Client)
        Catch ex As Exception
        End Try
        ' gets length of data comming in
        Try
            netStream.Read(DataLen, 0, 4)
        Catch ex As Exception
        End Try
        inLength = BitConverter.ToInt32(DataLen, 0)

        ' gets data comming in
        ReDim InData(inLength)
        netStream.Read(InData, 0, inLength)
        netStream.Flush()
    End SyncLock

    Buffer.WriteBytes(InData)
    MsgType = Buffer.ReadLong

    If InData.Length > (InData.Length - 4) Then
        ReDim NewData(InData.Length - 5)
        Array.ConstrainedCopy(InData, 4, NewData, 0, NewData.Length - 1)
        HandleDataSub(MsgType)(0, NewData)
    Else
        HandleDataSub(MsgType)(0, Empty)
    End If

    Client_TCP.GetStream.BeginRead(Readbyte, 0, 1, New AsyncCallback(AddressOf ReceiveOneByte), Nothing)

End Sub

发送数据:

    Public Sub Send(ByVal Data() As Byte)
    Dim netStream As NetworkStream
    Dim len As Integer = Data.Length
    Dim DataLen() As Byte = BitConverter.GetBytes(len)
    Dim bit(0) As Byte
    bit(0) = 1
    SyncLock Client_TCP.Client
        netStream = New NetworkStream(Client_TCP.Client)
        netStream.Write(bit, 0, 1)
        netStream.Write(DataLen, 0, 4)
        netStream.Write(Data, 0, Data.Length)
        'netStream.Flush()
    End SyncLock
End Sub

【问题讨论】:

  • 您可以发布任何套接字处理代码吗?特别是,所以我们可以看到出口?您使用的是哪个异步 API? (有几个异步套接字 API)你在检查套接字错误吗?您如何将单独的消息捆绑在线等?如果您使用较新的异步 API,您是否正在检查 ReceiveAsync 方法中的 return 值? (这很重要)

标签: .net vb.net sockets networking


【解决方案1】:

当您使用IAsyncResult Begin*(...) 模式时,调用End*(...) 方法是必需。这是它将告诉您它遇到的任何问题的地方。它可能正在尝试非常努力告诉您问题所在,但您没有检查。顺便说一句,在这种特殊情况下,您也可以在这里检查返回的字节数 - 如果流意外终止,它可能为 0。所以在你的方法顶部添加的第一件事是(伪代码......好吧,我在开玩笑...... C#):

try {
    int bytesRead = Client_TCP.GetStream.EndRead(ar);
    if(bytesRead < 1) {
        // EOF; do something
    } else if(bytesRead == 1) {
        // this is your expected scenario: your code here
    } else {
        // well that's just crazy talk!
    }
} catch (Exception ex) {
    // log this exception; shouldn't throw, because you are on a worker
    // thread here; you *might* want to clean up, though
}

这可能会让您开始诊断问题。还应该注意的是,这不是使用套接字的最有效方式 - 但它应该可以工作,我不想通过开始谈论替代异步 API 等来混淆事情。 p>

【讨论】:

  • 好的,所以我用了你给我的东西,这有助于更多。现在我遇到的问题是,当它运行所有工作代码时,它有时会无缘无故地断开连接。
  • @TravisHintz 定义“断开连接”。一个EOF?例外?要么...?但是:有趣的事实 - 套接字确实偶尔会中断。
  • 很难解释,但是通过所有的阅读都很好,它会像它应该的那样处理数据。只是,当它正在运行并且服务器和客户端正在相互通信时,套接字将断开连接而没有错误。它可以处理数据并将其放入一个新数组中,然后套接字将发出。
  • @TravisHintz 那么这是如何体现的:你根本就没有得到异步回调吗?还是它进入你的方法?
  • 我将我的代码放入您的代码中并消除同步。这是一个快速运行..我启动服务器,启动客户端,它们连接并且都在等待数据。我通过网络流将登录信息从客户端发送到服务器,然后它会输入您的代码。 bytesread 等于 1 并进入我的代码。当服务器正在读取网络流或仅处理传入数据时,套接字只是在不同时间断开连接,我的数据仍将正常工作并进入我的处理程序子,然后服务器应用程序突然关闭,没有抛出任何错误。
猜你喜欢
  • 2013-11-29
  • 2012-04-25
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多