2012-03-07 3 views
0

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

Как я могу сделать пакет с использованием Dim buffer в качестве байта()?

+0

Почему бы не вы первый отправить управляющий символ? 1 = текст, 2 = изображение и т. Д. ... тогда вы будете знать, какие данные вы получаете, и вы можете действовать соответствующим образом. –

ответ

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

0

Вы можете создать новый класс, который может содержат 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 

+0

извините за плохой формат ... im только новый здесь>. < – jasperagrante

Смежные вопросы