【问题标题】:Socket Programming: Delay套接字编程:延迟
【发布时间】:2016-04-18 18:51:06
【问题描述】:

我有一个用 C# 为 Windows 编写的服务器应用程序。我有一个适用于 android 的客户端应用程序。我想在无限循环中从客户端连续发送数据到服务器。正在发送数据,但有时会出现严重延迟。我真的很坚持。这是我的客户端代码:

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

知道为什么会有延迟吗?

【问题讨论】:

  • 延迟有多严重?服务器在哪里?可能是您的网络或互联网路由。
  • 有时沟通顺畅。有时,消息会在最多 5 秒的延迟后收到。如果你说,我也会附上服务器端代码。
  • 我不一定想查看服务器代码,只需向我们提供有关您的服务器所在位置的信息。它是否插入到您正在开发的同一网络中?是在工作,是在另一个国家吗?
  • 它在同一个网络中。服务器在我的电脑里,客户端在我的安卓手机里。两者都在同一个网络上。
  • 首先我建议您像 Knossos 所说的那样重构您的代码。然后将Thread.sleep(1);放到while循环中,看看是否还有延迟。

标签: java c# android sockets


【解决方案1】:

您的问题是您在 while 循环的每一次迭代中都在初始化套接字。

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

在循环之外重构它,像这样:

new Thread(new Runnable() {
    public void run() {
        Socket socket = new Socket(IP, PORT);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        while(true) {
            try {
                out.println(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}).start();

除非这是设计使然,在这种情况下,为什么?

【讨论】:

  • 是的,我也试过了。但在这种情况下,服务器只收到第一条消息。第一条消息是指第一次迭代中“msg”的值。
  • 发送数据后刷新 PrintWriter 有帮助吗? out.flush();
  • socket.close(); 无法访问。如果我删除它并使用 out.flush(),效果仍然相同。只收到第一条消息。
  • 该代码在服务中吗?你想达到什么目的?目前用msg 充斥服务器?延误可能有很多原因。按照您的编码方式,我可以想象本地端口的释放速度不够快......
  • 此代码在我的 Activity 的 onCreate 中。我正在尝试将设备加速度计的当前 x y z 值发送到服务器。
【解决方案2】:

看来代码是正确的。延迟可能不仅是应用程序造成的,也可能是网络状态造成的。

尝试从两台设备 ping 到路由器,看看您是否因无线连接而出现延迟峰值。如果您发现 ping 延迟很高,则问题出在连接上,而不是应用程序上。

【讨论】:

  • 我从客户端 ping 了服务器,最长时间是 54.5 毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2023-03-27
  • 2010-09-30
  • 2017-04-23
  • 2020-12-17
  • 2020-02-07
相关资源
最近更新 更多