Почему не полностью передается текст русский в datagramSocket java?
Захотелось посмотреть как всё таки просто сделать на java multicast чат. ну как просто, не нужно опции для сокета задавать, как это делается в си. в общем появилась проблема. английский текст он нормально отображает, а русский, после пробела перестает правильно отображать. вот код. Multi.java
import java.net.*;
import java.io.*;
public class Multi {
public static void main ( String[] args ) {
final int port = 6789;
InetAddress group;
try {
group = InetAddress.getByName ( "228.5.6.7" );
} catch ( UnknownHostException e ) {
return;
}
try {
MulticastSocket s = new MulticastSocket ( port );
s.joinGroup ( group );
Reader r = new Reader ( s );
r.start ( );
BufferedReader reader = new BufferedReader ( new InputStreamReader ( System.in ) );
while ( true ) {
byte[] buf = new byte[1000];
String msg = reader.readLine ( );
if ( msg.equals ( "/quit" ) ) break;
DatagramPacket datagramPacket = new DatagramPacket ( msg.getBytes ( ), msg.length ( ), group, port );
s.send ( datagramPacket );
}
s.leaveGroup ( group );
} catch ( IOException e ) {
return;
}
}
}
и вот код reader.java
import java.net.*;
import java.io.*;
public class Reader extends Thread {
private MulticastSocket multiSocket;
public Reader ( MulticastSocket s ) {
multiSocket = s;
}
public void run ( ) {
while ( true ) {
byte[] data = new byte[1000];
DatagramPacket packet = new DatagramPacket ( data, data.length );
try {
multiSocket.receive ( packet );
System.out.println ( new String ( data ) );
} catch ( IOException e ) {
return;
}
}
}
}
Ответы (1 шт):
Автор решения: Anton Shchyrov
→ Ссылка
Ошибка здесь
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), msg.length(), group, port); ^^^^^^
String.length() возвращает длина строки в символах, а передаете вы байты
Должно быть так
byte[] bytes = msg.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length(), group, port);
и при чтении нужно указывать количество прочитанных байт
System.out.println(new String(data, 0, packet.getLength()));