【问题标题】:Android Socket Programming DelayAndroid Socket 编程延迟
【发布时间】:2016-04-16 21:08:04
【问题描述】:

我在 PC 上有一个客户端 android 应用程序和一个服务器程序。在客户端应用程序中,我在 Activity 的 onCreate() 中启动了一个新线程。在该线程中,有一个无限循环将消息发送到服务器。但有时会有长达 5 秒的延迟。这是客户端的代码:

编辑

new Thread(new Runnable() {
        public void run() {
            Socket socket = null;
            PrintWriter out = null;
            try {
                socket = new Socket(ip, 1755);
                out = new PrintWriter(socket.getOutputStream(), true);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while(true) {
                if(socket != null) {
                    out.println(msg);
                }
            }
        }
    }).start();

现在消息没有被传递。

【问题讨论】:

  • 你真的想在循环中创建套接字吗?为什么不创建一次然后循环发送然后关闭它?
  • 你检查我的答案了吗?
  • @Krish 是的,我刚刚检查了你的答案。现在我想在用户触摸屏幕时发送消息。所以,我只需在 onTouchEvent() 中调用 sendMessage() 吗?
  • 是的,您可以在 onTouch() 中发送消息。但尽量减少消息数。
  • @Krish 我在我的 Java 项目中使用了你的代码。如果我必须发送一条消息,它工作正常。但是当我在无限循环中尝试 sendMessage 时,只发送第一条消息。我犯了什么错误?

标签: android multithreading sockets


【解决方案1】:

参考这段代码,

    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;

    /**
     * @author Krish
     */
    public class Client {


        public void connect() {
            new Thread(new ClientThread()).start();
        }


        public void disconnect() {
            try {
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        public void sendMessage(String msg) {
            try {
                PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())),
                        true);


           out.println(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    private Socket socket;

    class ClientThread implements Runnable {

        private static final int SERVERPORT = 6000;

        private static final String SERVER_IP = "10.0.2.15";


        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }

}

也找到优化技术

【讨论】:

  • socket 对象可能为空。因为不同步。所以实现连接状态的回调和之后的sendMessage。
  • 你试过我的答案了吗?
  • 我们上次讨论的问题是什么?
  • 我一次又一次地创建套接字。在服务器上,我在第一次迭代后关闭了连接。
  • 对连接状态使用回调。这样您就可以在视图中显示离线和在线状态。
【解决方案2】:

可能是因为您正在创建无限数量的套接字并发送。而不是创建一次然后发送然后关闭或者可能是网络问题。

【讨论】:

  • 如果我要创建无限数量的套接字,我也会关闭它们。那么有什么问题呢?
  • @SalmanYounas 问题是你这样做很辛苦,浪费资源和网络流量。
  • @SalmanYounas 你真的想这样做吗?可以通过其他方式实现。而不是创建无限数量的套接字!
猜你喜欢
  • 2020-09-28
  • 2021-07-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多