2012-02-22 47 views
1

目前,客户端发送的消息是这样的:更好的socket通信系统

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 

所以它所做的就是将收到的信息和spli将其转换为使用-MSGDelimit-作为分隔符的数组。所以在这种情况下,CompareFileMD5()函数将收到12,54,filename.txt,*md5hash*。并基于它可以返回到客户端,无论MD5是否匹配。

当然,它工作,但它感觉sl and,服务器上的代码变得非常混乱。

这里的相关性较低的功能,从上面的代码(怀疑的问题,但你永远不知道):

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 

那么,该如何处理的更好/清洁/更专业的建议吗?

回答

0

根据不同的应用,您当前的解决方案可能会非常好。有一些事情可以脱颖而出:

  • “协议”在数据发送量方面有点重。数据段之间的分隔符增加了相当多的开销。在这个例子中,它可能占有效载荷的50%。另外,将所有数据作为文本发送可能使得有效载荷大于绝对必要的。但是,所有这些都不一定是问题。如果客户端和服务器之间的流量相对较小,那么线路上的额外数据可能根本就不成问题。对于这种大小的请求(有或没有相对高的分隔符开销),主要开销将是往返开销成本,并且通过将该分组的大小减小一半可能变化很小。但是,如果有数千条数据请求,那么减少有效负载大小将会有所帮助。

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

假设所示的例子是许多类似协议之一,我会倾向于采取不同的路线。一种可能性是将请求捆绑为JSON对象。现有的软件包可用于创建和读取JSON。一个例子是Json.NET。 JSON具有明确的结构,人类很容易阅读和验证,并且可以轻松扩展。根据您发送的数据,它可能会比当前的格式轻一些。 (也许你感兴趣的部分),它可能会更“专业”。

了一些额外的事情,我会做(个人意见):

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

感谢您的回复,您能否详细说明''可能是发送数据的客户端版本'',因为我不明白这句话。目前JSON看起来相当不错。 – natli 2012-02-22 16:22:51

+0

@natli:对不起,这并没有帮助我在句子中留下了一个字。我编辑并添加了澄清信息。 – 2012-02-22 16:30:19

+0

啊,现在有道理!非常感谢,看起来我有一些工作要做;) – natli 2012-02-22 16:39:19