2016-09-13 2 views
0

первую очередь, я новичок в программировании, и задача им пытаются выполнить это:Как отображать полученные байты как текст в java?

send bytes from my delphi program to java server(done!)

display received bytes as text in a java server

T H E Вопрос: Как отображать полученные байты в Java?

Большое спасибо, если бы вы могли помочь, это спасло бы меня по меньшей мере еще одну бессонную ночь.

Мой работает пример кода из приложения DELPHI:

procedure sendInt(val: integer); 
begin 
    Socket.SendByte(byte(val shr 24)); 
    Socket.SendByte(byte(val shr 16)); 
    Socket.SendByte(byte(val shr 8)); 
    Socket.SendByte(byte(val)); 
end; 

Java-сервер кода я был в состоянии собрать, вероятно, чепуху.

ServerSocket sc=new ServerSocket(9999); 
Socket s=sc.accept(); 
DataInputStream dos=new DataInputStream(s.getInputStream()); 
String msg=dos.readUTF(); 
System.out.println(msg); 

Что это делает: Если я запустить сервер Java, и отправить байт - возвращает нуль. Если я отправляю непрерывные байты - сервер ничего не делает, и только после того, как я закончу его отправку, вы увидите целую пучку нулей, не уверен, что это помогает, просто пытаясь дать как можно больше информации о барахло. Спасибо !

+0

Вы можете использовать конструктор 'String' [который принимает байты] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String (byte [],% 20java.nio.charset.Charset)) и распечатать результат. – Jezor

+1

Является ли 'val', что вы отправляете строку или номер? Похоже, вы должны читать 'int' вместо строки. – chrylis

+0

Да, вы правы, val целое число, я понял, что чтение строки и целого числа в java - это одна и та же процедура, я просто зеленый –

ответ

1

Предполагая, что вы хотите, чтобы пройти и отображать int32 в таком формате в вашем потоке (вы отправляете тупоконечник), то концептуально простой способ:

InputStream is = s.getInputStream(); 
int val = 0; 
for(int i = 0; i<4; i++) { 
    val <<= 8; // does nothing first time 
    val |= is.read(); 
} 
System.out.println(val); 

Это собирает полученные байты в int32 и печатает его как форматированную строку с новой строкой.

+0

Не знал, что вы можете отправить два ответа ... узнать что-то новое каждый день. –

+0

Мех, и нигде в пользовательском интерфейсе не удалять его. Тьфу. –

+0

Спасибо, что помогли! Я попытался добавить ваш код, но компилятор возвращает следующее: ошибка: не удается найти символ val | = s.read(); ^ Есть ли что-то, что может быть ошибочно с кодом, или это все, что я? –

0

Предполагая, что вы намеревались восстановить строку, то InputStreamReader и LineNumberReader - ваши друзья.

Java известен как одна из немногих платформ, которые жестко управляют управлением кодировкой (например, Unicode), поэтому вы не можете trivially обменивать байты и символы. Но вы можете сделать что-то вроде:

LineNumberReader lines = new LineNumberReader(
    new InputStreamReader(
     s.getInputStream() 
    ) 
); 
String someLine = lines.readLine(); 

... и, конечно, имеющий дело с исключениями. InputStreamReader позволяет вам читать() по отношению к потоку байтов как символы (и, обратите внимание, что кодировка UTF8 по умолчанию, но НЕ единственная кодировка, которую вы можете использовать), и LineNumberReader позволяют вам выставлять строки за строкой вместо char- по-гольца.

Конечно, если вы хотите использовать char-by-char, вы можете использовать read() и полностью потерять LineNumberReader. Что-то вроде:

// 4 chars only 
char buf[4]; 
reader.read(buf, 0, buf.length); 
String s = new String(buf); 

Кроме того, будьте осторожны с недействительными последовательностями байтов Unicode. См. Документы InputStreamReader для указателей на работу с Charsets.

+0

Что делает 'LineNumberReader.readLine() 'делать, что BufferedReader не делает? Кажется довольно странным использовать LineNumberReader –

+0

Личные предпочтения на самом деле; Мне нравится иметь доступ к счетчику номеров линий, и нет реальной производительности или штрафа за совместимость. BufferedReader подходит для этого варианта использования. –

+0

Большое спасибо за такой подробный ответ. BJ Black. Используется ли linenumber reader, если мне нужно прочитать int? Мне просто нужно отобразить полученный int в cmd –

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