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?

È stato utile?

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
scroll top