0

現在チャットサーバーとして機能しているプログラムがあります。対戦相手とコミュニケーションをとるためのチャットボックスを備えたターン制のカードゲームです。チャットはすべて接続を介して機能しますが、特定のカードを対戦相手に送信し始める必要があるところまで来ています。これにより、カードをプレイしたときに、対戦相手がそのカードを画面に表示します。クライアントコンピュータがオブジェクトまたはオブジェクトのコレクションを受信し、そのプロパティに基づいてカードタイプが何であるかを把握し、カードを正しい場所に配置するようにします。送信と受信の部分は、私がどのように達成するかを理解していないものです。私が読んだことから、これにはシリアル化が必要であり、これをどこから始めればよいのかわかりません。手伝ってください!VisualStudioを使用しています。

4

1 に答える 1

0

自分の質問にもう一度答えます...文字列としてcardTypeを、intとしてcardidを含むcardcontainerという新しいクラスを作成することになりました。カードコンテナには他にもプロパティがあるので、カードの行き先がわかります。次に、カードコンテナ(次のコードでは「cc」)をシリアル化し、次のように送信しました。

Dim cc as new CardContainer
cc.id = card.id
cc.cardType = card.GetType.ToString
cc.discard = true

Dim bf As New BinaryFormatter
Dim ms As New MemoryStream
Dim b() As Byte

'serializes to the created memory stream
bf.Serialize(ms, cc)
'converts the memory stream to the byte array
b = ms.ToArray()
ms.Close()

'sends the byte array to client or host
SyncLock mobjClient.GetStream
    mobjClient.GetStream.Write(b, 0, b.Length)
End SyncLock

クライアントはTCPClientで何かをリッスンし、次のコードでカードを取得します。

    Dim intCount As Integer

    Try
        SyncLock mobjClient.GetStream
            'returns the number of bytes to know how many to read
            intCount = mobjClient.GetStream.EndRead(ar)
        End SyncLock
        'if no bytes then we are disconnected
        If intCount < 1 Then
            MarkAsDisconnected()
            Exit Sub
        End If

        Dim bf As New BinaryFormatter
        Dim cc As New CardContainer
        'moves the byte array found in arData to the memory stream
        Dim ms As New MemoryStream(arData)

        'cuts off the byte array in the memory stream after all the received data
        ms.SetLength(intCount)
        'the new cardContainer will now be just like the sent one
        cc = bf.Deserialize(ms)
        ms.Close()

        'starts the listener again
        mobjClient.GetStream.BeginRead(arData, 0, 3145728, AddressOf DoRead, Nothing)

カードコンテナが持っているデータに応じて、クライアントが現在呼び出すメソッドを決定します。たとえば、これを受信すると、作成されたccがCardReceivedメソッドに渡され、CardReceivedメソッドに一連のif、elseifステートメントが含まれます。それらの1つは

ElseIf cc.discard = true then
'makes a new card from the id and cardType properties
dim temp as new object = MakeCard
'discard method will find the correct card in the Host's known hand and discard it to the correct pile
Discard(temp)
于 2013-01-09T19:18:34.830 に答える