1

我目前正在 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
4

1 回答 1

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

于 2013-06-01T20:36:16.143 回答