【问题标题】:message skip in local wifi chat without internet在没有互联网的本地 wifi 聊天中跳过消息
【发布时间】:2021-01-15 23:17:02
【问题描述】:

我想在没有互联网的情况下使用 wifi 在两个或更多设备上聊天。我正在使用套接字从第一个 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();
        }
     

【问题讨论】:

  • 嗯,我的意思是... DatagramSocket (UDP) 是一种协议,其中一些消息在本质上会丢失。为什么不改用 TCP? Here's 一个很好的教程来帮助你入门
  • 如何在 TCP 中管理群聊?如果你有链接,请分享。
  • 使用 udp 不一定会丢失消息。这可能会发生,显然正如您所指出的那样,因为它的性质的一部分......但是有一些解决方法可以使 udp 连接有效并且不会丢失消息..

标签: java android sockets android-wifi wifi-direct


【解决方案1】:

您可以在 UDP 之上实现类似 TCP 的行为,请参阅此 repo,例如:https://github.com/jin-zhe/reliable-UDP/blob/master/Sender.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多