首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更好的socket通信系统

更好的socket通信系统
EN

Stack Overflow用户
提问于 2012-02-22 23:10:11
回答 1查看 167关注 0票数 1

目前,客户端发送的消息如下:

代码语言:javascript
复制
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*

然后它会读出:

代码语言:javascript
复制
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是否匹配。

当然,它可以工作,但它感觉很草率,服务器上的代码变得非常混乱。

下面是上面代码中不太相关的函数(怀疑这很重要,但你永远不会知道):

代码语言:javascript
复制
Private Function breakDown() As ArrayList
    Try
        Dim theArray As New ArrayList
        Dim copymsg As String = _message

        Dim counter As Integer = 0
        Do Until Not copymsg.Contains("-MSGDelimit")
            Dim found As String

            found = copymsg.Substring(0, copymsg.IndexOf("-MSGDelimit" & counter & "-"))

            theArray.Add(found)
            copymsg = copymsg.Replace(found & "-MSGDelimit" & counter & "-", "")

            counter += 1
        Loop

        theArray.Add(copymsg)
        Return theArray
    Catch ex As Exception
        Module1.msg(ex.Message)
    End Try
End Function

Private Function CompareFileMD5(ByVal userID As Integer, ByVal gameID As Integer, ByVal filename As String, ByVal source As String) As String
    Try
        Dim tryFindFile As String = Module1.filedatabase.findfile(userID, gameID, filename)

        If Not tryFindFile = "notFound" Then
            Dim fileFull As String = tryFindFile & "\" & filename
            Dim md5 As New CMD5
            If md5.GenerateFileHash(fileFull) = source Then
                Return "Match"
            Else
                Return "NoMatch"
            End If
        Else
            Return "notFound"
        End If
    Catch ex As Exception
        Module1.msg("0")
        Return "0"
    End Try
End Function

那么,对于如何更好地/更干净/更专业地处理它,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-23 00:05:50

根据应用程序的不同,您当前的解决方案可能完全没有问题。有几件事确实有一点突出:

  • “协议”在发送的数据量方面有点重。数据片段之间的分隔符增加了相当多的开销。在本例中,它可能占有效负载的50%。此外,以文本形式发送所有数据可能会使有效负载大于绝对必要的负载。然而,所有这些都不一定是问题。如果客户端和服务器之间的流量相对较小,那么网络上的额外数据可能根本不是问题。对于这种大小的请求(有或没有相对较高的分隔符开销),主要成本将是往返成本,并且可能通过将此分组的大小减半而变化很小。但是,如果有包含数千条数据的请求,那么减少有效负载大小将有所帮助。
  • 根据发送的数据,所示分隔符的使用可能不明确。考虑到分隔符的长度和格式,这是不太可能的,但如果存在实际数据“看起来”像分隔符的可能性,请记住这一点。

假设所示的示例是许多类似协议中的一个,我倾向于采用不同的路线。一种可能是将请求捆绑为一个JSON对象。现有的包可用于创建和读取JSON。Json.NET就是一个例子。JSON具有定义良好的结构,易于阅读和验证,并且易于扩展。根据您发送的数据,它可能比当前格式更轻量级一些。而且(也许你感兴趣的部分),它可能看起来更“专业”。

我还会做几件额外的事情(个人观点):

  • 可能会向正在发送的数据添加客户端版本,以便服务器知道它是否“识别”该请求。以某个值(例如,1)启动客户端版本。如果协议格式有更新(例如,不同的数据、不同的结构),请在该软件版本中将版本更改为2。然后,服务器可以查看版本号,看看是否能识别它。如果它是服务器的第一个版本,并且看到版本2,那么它可能会返回一个错误,指示服务器需要更新。如果您可以保证客户端和服务器版本总是匹配的,那么这就不是必需的(有时在practice).
  • Use中很难为请求类型指定整数值,而不是字符串('checkFileMD5') )。如果有大量的请求类型,服务器可以根据整数值更有效地(也许)分派请求。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9397412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档