Нужна помощь с чтением данных с сервера в Java - PullRequest
1 голос
/ 23 февраля 2011

У меня небольшие проблемы с DataInputStreams,

Итак, у меня есть данные для локального сервера, я знаю, что байты, которые я прочитал, будут следовать этому формату

0x01, чтобы указать, что это строка

затем случайное количество байтов

с последующим трейлингом 0x00 0x00,

У меня проблемы с чтением с сервера,

вот мой метод чтения

    public static String convertFromServer(DataInputStream dis) throws IOException{
    //Buffer to hold bytes being read in
    ByteArrayOutputStream buf = new ByteArrayOutputStream();

    if(dis.read() != -1){
        //Check to see if first byte == 0x01
    if(dis.read() == 0x01){
        //Check if byte dosnt equal 0x00, i need it to check if it is actually 0x00 0x00
        while(dis.read() != 0x00){
            buf.write(dis.read());
        }
    }

    if(dis.read() == 0x03){    

        while(dis.read() != 0x00){

            buf.write(dis.read());
        }
    }
    }
    String messageRecevied = new String(buf.toByteArray());
    return messageRecevied;

}

Если я немного двусмысленна, дайте мне знать.

Я получаю данные обратно, но это не совсем правильно, в основном я отправляю по байтовому массиву, где первый элемент равен 0x01 для указания строки, затем строка в байтах и, наконец, последние 2 элемента. 0x00 и 0x00, затем эти данные затем отправляются мне обратно с сервера, сервер определенно получает данные, просто когда я читаю обратно, они не верны, письмо будет отсутствовать

этот код записывает кодирует данные в формате 0x01, затем сообщение в байтах, затем 0x00,0x00

  public static void writeStringToBuffer(ByteArrayOutputStream buf,String message){

    buf.write(0x01);

    byte[] b = message.getBytes();

    for(int i =1; i<message.getBytes().length+1;i++ ){

        buf.write(b[i-1]);

     }
    buf.write(0x00);
    buf.write(0x00);


}

1 Ответ

1 голос
/ 23 февраля 2011

Что всегда меня привлекает, когда я выполняю работу с сокетами, так это то, что заказы на сервере и клиенте меняются местами.

Если сервер читает первым, клиент должен сначала записать.Если Сервер пишет первым, клиент должен прочитать первым.Если они оба пытаются читать или оба пытаются писать, вы не получите никакого вывода.

Я рекомендую сделать это:

if(dis.read() == 0x01) {
    int zeroesInARow = 0;

    while(zeroesInARow < 2) {
        int b = dis.read()
        if(b == 0x00) zeroesInARow++;
        else zeroesInARow = 0;
        buf.write(b);
    }
    String rawMessage = new String(buf.toArray());
    // take off the last two 0s
    String messageRecevied = rawMessage.substring(0,rawMessage.length()-2);
    return messageRecevied;
}
...