Java CharBuffer из сокета ERROR_FORMAT

Java: 1.7 ОС: Linux (но я не знаю, что это за Linux)

У меня есть CharBuffer, чтобы содержать то, что я читал из BufferedReader сокета. Socket был установлен, это точно, и когда я пытаюсь его сбросить, он дает результат ERROR_FORMAT.

После этого я прочитал данные из сокета, но вызвал java.net.SocketException: сброс соединения

Я решаю проблему сброса соединения, но почему CharBuffer.toString () дает результат ERROR_FORMAT?

Ниже мой код, что-то не так?

Socket connectionSocket=xxxxxx;  //Connected socket given by other library

connectionSocket.setSoTimeout(75*1000);
CharBuffer charBuffer=CharBuffer.allocate(1024);
BufferedReader bufferedReader=null;

bufferedReader=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream(), "BIG5"));

while((bufferedReader.read(charBuffer))!=-1)  // in 2nd time, this line throw a java.net.SocketException: Connection reset
{
  charBuffer.flip();
  respStr.append(charBuffer);
  log.info("CharBuffer: "+charBuffer.toString());  // this line runs just 1 tine, print result: "CharBuffer: 2016102618353211301 : ERROR_FORMAT"
  charBuffer.clear();
}
log.info("CharBuffer all: "+charBuffer.toString());  // dodn't been execute

person RRTW    schedule 27.10.2016    source источник
comment
Возможно, символы в вашем потоке данных отсутствуют в BMP, что может вызвать проблемы. Я бы посоветовал вам поместить необработанные данные в ByteArraryInputStream вместо использования сокета, пока вы не выясните проблему.   -  person BevynQ    schedule 27.10.2016
comment
Что такое БМП?   -  person RRTW    schedule 27.10.2016


Ответы (1)


Мне не удалось воспроизвести вашу проблему

public static void main(String[] args) throws IOException {
    StringBuilder respStr = new StringBuilder();
    CharBuffer charBuffer=CharBuffer.allocate(1024);
    BufferedReader bufferedReader=null;
    Logger log = Logger.getAnonymousLogger();

    // create a byte stream with some big 5 characters in it
    // to simulate what a socket should produce
    byte[] bytes = new byte[100];
    int index = 0;
    for(int i = 0xc940;i<0xc940+50;i++){
        bytes[index++] = (byte)((i & 0x0ff00)>>8);
        bytes[index++] = (byte)((i & 0x0ff));
    }
    InputStream byteStream = new ByteArrayInputStream(bytes);

    // code to process the byte stream
    bufferedReader=new BufferedReader(new InputStreamReader(byteStream, "BIG5"));
    while((bufferedReader.read(charBuffer))!=-1){
        charBuffer.flip();
        respStr.append(charBuffer);
        log.info("CharBuffer: "+charBuffer.toString());
        charBuffer.clear();
    }
    log.info("CharBuffer all: "+charBuffer.toString());
}

27 октября 2016 г. 18:27:18 nz.test.buffers.CharBufferTest main

ИНФОРМАЦИЯ: CharBuffer: ‹китайские иероглифы>

27 октября 2016 г. 18:27:18 nz.test.buffers.CharBufferTest main

ИНФОРМАЦИЯ: CharBuffer все: ‹китайские иероглифы>

person BevynQ    schedule 27.10.2016