Ricevi array byte da dati con carattere persiano
Domanda
Il mio codice è un messaggero che invia messaggi da un dispositivo Android a un altro dispositivo Android su WiFi.
Ecco il mio codice, in questa classe invio il messaggio:
public class ClientThread extends Thread {
String address;
String message;
int portNum;
InetAddress serverAddr;
Socket socket;
PrintWriter out;
boolean broadcast;
public ClientThread(String addr, int port, String msg, boolean bcast) throws IOException {
address = addr;
portNum = port;
message = msg;
broadcast = bcast;
}
public void run() {
try {
ChatService.portsocket.setBroadcast(broadcast);
// Charset.forName("UTF-8").encode(message);
// Log.d("client",new String(message.getBytes()));
// byte[] b = EncodingUtils.getBytes(message,
// Charset.forName("UTF-8").name());
DatagramPacket packet1 = new DatagramPacket(message.getBytes(), message.length(),
InetAddress.getByName(address), 5555);
ChatService.portsocket.send(packet1);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
.
E in questa classe ricevo il messaggio:
public class ChatService extends Service {
public static String serverIP;
public static int serverPort = 5555;
private ServerSocket serverSocket;
private serverThread sThread;
public static final String BROADCAST_ACTION = "UpdateEvent";
public static DatagramSocket portsocket;
Intent intent;
int i = 0;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
private class serverThread extends Thread {
public void run() {
try {
serverIP = getLocalIpAddress();
Log.v("addr", serverIP);
if (serverIP != null) {
serverSocket = new ServerSocket(serverPort);
Log.v("socket", "created");
while (true) {
/*
* Socket client = serverSocket.accept();
* Log.v("client", "received");
*/
try {
byte [] buf = new byte [1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
ChatService.portsocket.receive(packet);
byte [] result = new byte [packet.getLength()];
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Log.d("armin", msg);
updateGui(msg, packet.getAddress());
}
catch (Exception e) {
}
}
}
}
catch (Exception e) {
}
}
}
}
.
Quando digito per esempio آرمین e invialo, il messaggio che l'app riceve è una parola incoerente per esempio آر Qualcuno ha idea di risolverlo?
Soluzione
Se hai un
String message = ...;
.
Questo viene convertito in un byte []
byte[] bytes = message.getBytes();
.
Quindi il datagrampacket deve essere costruito utilizzando
new DatagramPacket(bytes, bytes.length(), ... );
.
La tua chiamata utilizza
new DatagramPacket( message.getBytes, message.length(),..,
.
Ma questo utilizza la lunghezza della stringa ma la farsi richiede più di un byte per personaggio.
La stringa آرمین ha 5 caratteri, ma la codifica UTF-8 richiede 10 byte.È necessario inviare 10 byte.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow