Java 无互联网的本地wifi聊天中的消息跳过
我想在两个或多个设备上聊天,使用wifi而不使用互联网。我正在使用套接字将消息从第一台android手机发送到第二台手机。我面临的问题是,一些按摩被接收,一些按摩跳过,而第二部手机没有接收到。我尝试过多播Soket和Datagramsoket,但跳过了短信。以下是我的发送端和接收端代码Java 无互联网的本地wifi聊天中的消息跳过,java,android,sockets,android-wifi,wifi-direct,Java,Android,Sockets,Android Wifi,Wifi Direct,我想在两个或多个设备上聊天,使用wifi而不使用互联网。我正在使用套接字将消息从第一台android手机发送到第二台手机。我面临的问题是,一些按摩被接收,一些按摩跳过,而第二部手机没有接收到。我尝试过多播Soket和Datagramsoket,但跳过了短信。以下是我的发送端和接收端代码 **- Sender side** public static void sender(final String ipAddress, final String message) {
**- 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();
}
您可以在UDP之上实现类似TCP的行为,例如,请参阅此repo:嗯,我的意思是。。。DatagramSocket(UDP)是一种协议,其中某些消息由于其本身的性质而丢失。为什么不改用TCP呢?这是一个很好的教程,可以帮助您入门。我如何在TCP中管理群聊?如果您有链接,请共享。您可以检查是否使用udp会丢失消息。这可能发生,很明显,正如你所指出的,因为这是它的本质的一部分。。。但是有一些变通方法可以使udp连接有效,而不是松散的消息。。