2016-03-12 3 views
0

Я пишу программу Java сокета для чтения данных с сервера, я не имею никакого контроля на сервер, ниже протокол согласился,как писать байты в сокет сервера

  • 2-байты: магическое число
  • 2-байт: длина данных
  • N-байт: ASCII строка данных полезной нагрузки
  • Большой обратный порядок байт для магического числа и длины

данных для примера: если мой ре Квест - это «команда/1/getuserlist», как построить запрос на запрос выше протокола и прочитать ответ обратно в список

Я новичок в программировании сокетов и понятия не имею, как построить мой запрос и прочитать ответ.

может кто-то наставит меня, как построить запрос и прочитать ответ от

ответ

1

Согласно спецификации вы должны построить пакет форме следующим образом

| 2 | 2 | N ........ | 

Теперь это может быть довольно легко и есть несколько способов сделать это, я предлагаю вам один:

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 

static byte[] buildPacket(int magicNumber, String payload) throws UnsupportedEncodingException 
{ 
    // 4 bytes for header + payload 
    ByteBuffer buffer = ByteBuffer.allocate(2 + 2 + payload.length()); 
    // we set that we want big endian numbers 
    buffer.order(ByteOrder.BIG_ENDIAN); 

    buffer.putShort((short)magicNumber); 
    buffer.putShort((short)payload.length()); 
    buffer.put(payload.getBytes("US-ASCII")); 
    return buffer.array(); 
} 

public static void main (String[] args) throws java.lang.Exception 
{ 
    try 
    { 
     byte[] bytes = buildPacket(0xFF10, "foobar"); 
     for (byte b : bytes) 
      System.out.printf("0x%02X ", b); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

виду, что если вы объявляете метод принять short магическое число напрямую, вы не сможете передать буквальное магическое число > 32767, потому что short подписан на Java.

+0

Джек, как я могу прочитать ответ в том же порядке? – Sam

+0

В документации 'ByteBuffer' есть все, что вам нужно: https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html – Jack

0

Используйте DataOutputStream вокруг BufferedOutputStream вокруг `Socket.getOutputStream(). Затем вы можете использовать:

  • writeShort() для магического числа
  • writeShort() для длины слова
  • write() для полезной нагрузки.

Аналогичным образом вы можете использовать DataInputStream и соответствующие методы readXXX(), чтобы прочитать ответ.

NB Вы пишете здесь, а не в качестве сокета.

-1

Остерегайтесь большой бесконечности!

DataxxxStream - хотя это очень удобно - не предлагает полной поддержки как для маленьких, так и для больших чисел endian и произвольных строковых кодировок.

Смотрите мой пост в How to Read Byte Stream from Socket

+0

В этом вопросе четко указывается порядок байтов байтов. – EJP

+0

EJP, я уважаю ваши ответы. Мне интересно, почему вы игнорируете те случаи, когда DataXxxxStream - это * не * решение, такое как маленькие конечные данные, и кодировка строки не utf8 в двух отдельных вопросах ?! –

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