vb.net 2010套接字突然停止了?

时间:2013-06-01 03:56:08

标签: .net vb.net sockets networking

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

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

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

现在我已经确定其他代码没有影响套接字,并且评论了所有不需要的代码,并允许每个服务器和客户端保持循环。 (创建一个游戏,所以有一个服务器循环和游戏循环)它似乎它完成了所有的工作,然后退出读取子,并停止听更多阅读。

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

每一方的代码都是相同的:

接收数据:

    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

1 个答案:

答案 0 :(得分:0)

使用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等来混淆事情。