2012-02-22 23 views
1

現在、クライアントは、このようなメッセージを送信している:ベター・ソケット通信システム

checkfileMD5-MSGDelimit0-12-MSGDelimit1-54-MSGDelimit2-filename.txt-MSGDelimit3-*md5hash*

それは、その後読み出し:

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 

サーバはこのような何かを受け取ることができます

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がマッチしたかどうかにかかわらずクライアントに戻ることができます。

確かに動作しますが、サーバー上のコードがかなり乱雑になります。

は、ここで(それが重要疑うが、あなたが知っていることはありません)上記のコードから、あまり関係の関数です:

だから、
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%を占めています。さらに、すべてのデータをテキストとして送信すると、ペイロードが絶対に必要以上に大きくなります。しかし、これは必ずしも問題ではありません。クライアントとサーバー間のトラフィックが比較的軽い場合、電線上の余分なデータがまったく問題にならないことがあります。このサイズの要求(デリミタオーバーヘッドが比較的高いかどうかにかかわらず)の主なコストは往復コストであり、このパケットのサイズを半減することによってほとんど変化しない可能性があります。ただし、何千ものデータが要求される場合は、ペイロードのサイズを小さくすると役立ちます。

  • 示されているようにデリミタを使用すると、送信されるデータによってはあいまいになる可能性があります。区切り文字の長さと形式を考えるとほとんどありませんが、デリミタのような "見た目"の実際のデータがある可能性がある場合は、注意する必要があります。

  • ここに示した例は、多くの類似したプロトコルの1つであると仮定して、私は別のルートに行く傾向があります。 1つの可能性は、リクエストをJSONオブジェクトとしてバンドルすることです。 JSONの作成と読み取りに使用できる既存のパッケージがあります。一例はJson.NETです。 JSONは明確な構造を持ち、人間が読みやすく、検証することは容易で、簡単に拡張できます。送信するデータによっては、現在のフォーマットよりも少し軽いかもしれません。そして(多分あなたが興味を持っている部分)、おそらくもっとプロフェッショナルに見えるでしょう。

    私はどうなる追加のもの(個人的な意見)のカップル:

    • おそらくそれは、要求を「認識」場合は、サーバーが知っているように、送信されたデータにクライアントのバージョンを追加します。クライアントバージョンをある値(たとえば、1)で開始します。プロトコルフォーマットの更新(例えば、異なるデータ、異なる構造)がある場合、そのソフトウェアのリリースでバージョンを2に変更する。次に、サーバーはバージョン番号を見て、それが認識できるかどうかを調べることができます。サーバーの最初のバージョンで、バージョン2が表示されている場合、サーバーを更新する必要があることを示すエラーが返されます。これは、クライアントとサーバーのリリースが常に一致することを保証できる場合(実際には困難な場合があります)には必要ありません。
    • 文字列( 'checkFileMD5')ではなく要求タイプに整数値を使用します。多数のリクエストタイプが存在する場合、サーバーは整数値に基づいてリクエストをより効率的に(多分)ディスパッチできます。
    +0

    私はその文を理解していないので、返信いただきありがとうございます。おそらく "送信されるデータのクライアントバージョン"について詳しく説明できますか? JSONは今のところよく見ています。 – natli

    +0

    @natli:申し訳ありません。私はその文の中から一言を残しておいたのです。私は編集し、明確な情報を追加しました。 –

    +0

    ああ、今や意味がある!ありがとう、私はいくつかの仕事があるように見えます;) – natli