Как мне создать заголовки пакетов? - PullRequest
0 голосов
/ 07 марта 2012

В основном я отправляю и получаю оба изображения, строки и файлы через соединение клиент / сервер.Я могу легко использовать протокол для строковых команд, но я не могу различить входящие данные [если данные являются изображением или чем-то еще, а затем следовать последующим инструкциям].

Итак, как мне сделать пакет, используя буфер Dim в качестве байта ()?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Я просто сделаю дикое предположение о том, что вы пытаетесь сделать. Если вы используете TCPListener для обработки входящего HTTP-соединения, вы можете ответить так:

    Private Sub ServePNG()

        Dim stream As NetworkStream = mytcpclient.GetStream

        Dim Content As Byte() = System.IO.File.ReadAllBytes("image.png")

        Dim sb As New System.Text.StringBuilder
        sb.Append("HTTP/1.0 200 OK" + ControlChars.CrLf)
        sb.Append("Content-Type: image/png" + ControlChars.CrLf)
        sb.Append("Content-Length: " + Content.Length.ToString + ControlChars.CrLf)
        sb.Append(ControlChars.CrLf)

        Dim Header() As Byte = Encoding.ASCII.GetBytes(sb.ToString)
        stream.Write(Header, 0, Header.Length)
        stream.Write(Content, 0, Content.Length)

        client.Close()

    End Sub

Я получаю байтовый массив прямо из image.png

0 голосов
/ 08 марта 2012

Вы можете создать новый класс, который может содержать Header Property, затем вы можете сериализовать этот класс и затем преобразовать его в байтовый массив

Пример:


Serializable()
    Public class Packet
    dim _header as packetHeader
    dim _data as byte()
    Public Property Header as packetHeader
    Get
    Return _Header
    End Get
    Set (byval value as packetHeader)
    _header = value
    End Set
    End Property
    Public Property Data as Object
    Get
    Return _Header
    End Get
    Set (byval value as Object)
    _data = value
    End Set
    End Property
    Public Sub New()
    End Sub
    Public Sub New(Byval header as packetHeader, Byval data as Object)
    _header = header
    _data = data
    End Sub
    Public Shared Function Serialize(myPacket as Packet) as Byte()
    Dim fs as New MemoryStream
    Dim formatter as New BinaryFormatter
    formatter.Serialize(fs, myPacket)
    Return fs.ToArray
    End Function
    Public Shared Function Deserialize(strm() as Byte) as Packet
    Dim fs as New MemoryStream(strm)
    Dim formatter as New BinaryFormatter
    Return DirectCast(formatter.Deserialize(fs),Packet)
    End Function
    End Class
    'Example of use
    Public Enum packetHeader as Integer
    Text = 0
    Image = 1
    'etc
    End Enum
    'Inside button click event (sending the packet)
    Dim bitmap as new Bitmap("C:/example.png")
    Dim data as Object =  bitmap
    Dim myPacket as new Packet(packetHeader.Image, data)
    dim buffer() as byte = Packet.Serialize(myPacket)
    'to deserialize the packet and check the header
    Dim buffer() as byte = stream.Read
    Dim myPacket as Packet = Packet.Deserialize(buffer)
    Select myPacket.Header
    Case packetHeader.Image
    Dim image as Bitmap
    image = DirectCast(myPacket.Data, Bitmap)
    Case packetHeader.Text
    Dim str as String
    str = DirectCast(myPacket.Data, String)
    End Select
    'do your proccess inside the Select statement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...