Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 更好的套接字通信系统_Vb.net_Sockets - Fatal编程技术网

Vb.net 更好的套接字通信系统

Vb.net 更好的套接字通信系统,vb.net,sockets,Vb.net,Sockets,当前,客户端正在发送如下消息: Public Function checkMD5(ByVal userID As Integer, ByVal gameID As Integer, ByVal file As String, ByVal fileFull As String) As String Dim make As New CMakeMSG Dim md5 As New CMD5 make.append("checkfileMD5") make.append(

当前,客户端正在发送如下消息:

Public Function checkMD5(ByVal userID As Integer, ByVal gameID As Integer, ByVal file As String, ByVal fileFull As String) As String
    Dim make As New CMakeMSG
    Dim md5 As New CMD5
    make.append("checkfileMD5")
    make.append(userID)
    make.append(containerID)
    make.append(file)
    make.append(md5.GenerateFileHash(fileFull))

    Return SocketSendAndReceiveMSG(make.makestring)
End Function
服务器可能会收到如下内容:

Public Function checkMD5(ByVal userID As Integer, ByVal gameID As Integer, ByVal file As String, ByVal fileFull As String) As String
    Dim make As New CMakeMSG
    Dim md5 As New CMD5
    make.append("checkfileMD5")
    make.append(userID)
    make.append(containerID)
    make.append(file)
    make.append(md5.GenerateFileHash(fileFull))

    Return SocketSendAndReceiveMSG(make.makestring)
End Function
checkfileMD5-MSGDelimit0-12-MSGDelimit1-54-MSGDelimit2-filename.txt-MSGDelimit3-*md5hash*

然后它读出:

Private _message As String
Public Function handleMessage() As String
    Dim brokenMessage As New ArrayList
    brokenMessage = breakDown() 'Split to ArrayList

        If brokenMessage(0) = "checkfileMD5" Then
            Try
                If brokenMessage.Count > 5 Then
                    Return "0-structureMessedUp"
                End If
                Return CompareFileMD5(brokenMessage(1), brokenMessage(2), brokenMessage(3), brokenMessage(4))
            Catch ex As Exception
                Return "0-structureMessedUp"
            End Try
        End If
End Function
因此,它所做的是获取接收到的消息,并使用-MSGDelimit-作为分隔符将其拆分为一个数组。因此在本例中,
CompareFileMD5()
函数将接收
12,54,filename.txt,*md5hash*
。基于此,无论MD5是否匹配,它都可以返回给客户端

当然,它可以工作,但感觉很邋遢,服务器上的代码变得非常凌乱

下面是上述代码中不太相关的函数(怀疑它是否重要,但您永远不知道):


因此,关于如何更好地/更干净地/更专业地处理它,您有什么建议吗?

根据应用程序的不同,您当前的解决方案可能非常好。有两件事确实有点突出:

  • 就发送的数据量而言,“协议”有点重。数据段之间的分隔符增加了相当多的开销。在本例中,它可能占有效载荷的50%。此外,以文本形式发送所有数据可能会使有效负载超出绝对必要的范围。然而,所有这些都不一定是问题。如果客户机和服务器之间的通信量相对较少,那么线路上的额外数据可能根本就不是问题。对于这种大小的请求(有或没有相对较高的分隔符开销),主要成本将是往返成本,并且通过将此数据包的大小减少一半,可能变化很小。但是,如果存在包含数千条数据的请求,那么减少有效负载大小将有所帮助

  • 所示分隔符的使用可能不明确,具体取决于发送的数据。考虑到分隔符的长度和格式,这是不可能的,但如果存在“看起来”像分隔符的实际数据的可能性,则需要记住这一点

假设所示的示例是许多类似协议中的一个,我倾向于采用不同的方法。一种可能是将请求捆绑为一个JSON对象。现有的包可用于创建和读取JSON。一个例子是。JSON有一个定义良好的结构,很容易让人阅读和验证,并且可以很容易地进行扩展。根据您发送的数据,它可能比当前的格式要轻一点。而且(可能是你感兴趣的部分),它可能看起来更“专业”

我还想做几件事(个人意见):

  • 可能会将客户端版本添加到发送的数据中,以便服务器知道是否“识别”该请求。以某个值(例如,1)启动客户端版本。如果协议格式有更新(例如,不同的数据、不同的结构),请在该版本的软件中将版本更改为2。然后服务器可以查看版本号,看看是否能识别它。如果它是服务器的第一个版本,并且看到版本2,那么它可能会返回一个错误,指示服务器需要更新。如果可以保证客户机和服务器版本始终匹配,则不需要这样做(有时在实践中很难做到)
  • 对请求类型使用整数值,而不是字符串('checkFileMD5')。如果有大量的请求类型,服务器可以基于一个整数值更有效地(可能)调度请求

感谢您的回复,您能否详细说明一下
“可能是发送数据的客户端版本”
,因为我不理解这句话。到目前为止,JSON看起来还不错。@natli:很抱歉;我在句子里漏掉了一个字,这没用。我编辑并添加了澄清信息。啊,现在有意义了!非常感谢,看来我还有工作要做;)