我目前正在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
答案 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等来混淆事情。