#java #android #sockets #android-wifi #wifi-direct
#java #Android #сокеты #android-wifi #wifi-прямой
Вопрос:
Я хочу общаться на двух или более устройствах, используя Wi-Fi без Интернета. Я отправляю сообщение с помощью сокета с первого мобильного телефона Android на второй мобильный. Я столкнулся с проблемой, что некоторый массаж получен, а некоторый массаж пропущен и не получен на втором мобильном телефоне. Я пробовал Multicastsoket и Datagramsoket, но текстовое сообщение пропущено. ниже приведен мой код на стороне отправки и получателя.
**- Sender side**
public static void sender(final String ipAddress, final String message) {
// Creates the thread for capturing and transmitting audio
/* AsyncTaskExample asyncTask = new AsyncTaskExample();
asyncTask.execute(message);*/
Thread replyThread = new Thread(new Runnable() {
@Override
public void run() {
try {
InetAddress address = InetAddress.getByName(ipAddress);
byte[] data = message.getBytes();
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(data, data.length, address, BROADCAST_PORT);
socket.setReuseAddress(true);
socket.send(packet);
Log.i(LOG_TAG, "Sent message( " message " ) to " ipAddress);
socket.disconnect();
socket.close();
} catch (UnknownHostException e) {
Log.e(LOG_TAG, "Failure. UnknownHostException in sendMessage: " ipAddress);
} catch (SocketException e) {
Log.e(LOG_TAG, "Failure. SocketException in sendMessage: " e);
} catch (IOException e) {
Log.e(LOG_TAG, "Failure. IOException in sendMessage: " e);
}
}
});
replyThread.start();
}
**- Receiver side**
public void receiver() {
// Creates the thread for receiving massage
Thread receiveThread = new Thread(new Runnable() {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(BROADCAST_PORT);
// InetAddress group = InetAddress.getByName(myIPAddress);
//socket.setSoTimeout(1000);
byte[] buffer = new byte[BUF_SIZE];
DatagramPacket packet = new DatagramPacket(buffer, BUF_SIZE);
while (LISTEN) {
// Listen for incoming call requests
try {
Log.i(LOG_TAG, "Listening for incoming message");
/* Arrays.fill(buffer,(byte)0);*/
socket.receive(packet);
String data = new String(buffer, 0, packet.getLength());
Log.i("SocketMSG", "Packet received from " packet.getAddress() " with contents: " data);
String action = data.substring(0, 4);
//Toast.makeText(context,"Packet received from",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
}
}
socket.disconnect();
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
});
receiveThread.start();
}
Комментарии:
1. Ну, я имею в виду… DatagramSocket (UDP) — это протокол, в котором некоторые сообщения теряются по самой своей природе. Почему бы вместо этого не использовать TCP? Вот хороший учебник, который поможет вам начать
2. Как я могу управлять групповым чатом в TCP? если у вас есть ссылка, пожалуйста, поделитесь.
3. Вы можете проверить cs.lmu.edu /~ray/примечания/javanetexamples примеры
4. не обязательно, что вы потеряете сообщения при использовании udp. это может произойти, очевидно, как вы указали, потому что это часть его природы… но есть обходные пути, позволяющие сделать udp-соединение эффективным, а не потерять сообщения..
Ответ №1:
Вы могли бы реализовать поведение, подобное TCP, поверх UDP, см., Например, Этот репозиторий: https://github.com/jin-zhe/reliable-UDP/blob/master/Sender.java