【问题标题】:How Do I Create Packet Headers?如何创建数据包标头?
【发布时间】:2012-03-07 16:53:32
【问题描述】:

基本上,我通过客户端/服务器连接发送和接收图像、字符串和文件。我可以轻松地将协议用于字符串命令,但我无法区分传入的数据[如果数据是图像或其他,然后按照后续说明进行操作]。

那么如何使用 Dim 缓冲区作为 byte() 来制作数据包?

【问题讨论】:

  • 为什么不能先发送一个控制字符? 1=文本、2=图像等...然后您就会知道您收到了什么数据并采取相应的行动。

标签: .net vb.net sockets networking packet


【解决方案1】:

我只是粗略地猜测一下您要做什么。如果您使用 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 中得到字节数组

【讨论】:

    【解决方案2】:

    您可以创建一个包含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
    
    

    【讨论】:

    • 抱歉格式错误...我是新来的>。
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多