java - Socket发送大量数据时会自动关闭吗?

标签 java android sockets

请帮我理解套接字。我一直通过套接字将加速度计数据从 Android 发送到 PC,一段时间后数据接收停止,然后过了一会儿我得到“客户端关闭连接”。 是否是由于网络中断而导致套接字不太可靠?

public class Connection {

    private String IP;
    private int port;
    private Socket socket;
    private PrintWriter output;

    public void connect(String IP, int port) {
        this.IP = IP;
        this.port = port;
        new Connect().execute();
    }

    public void sendText(String data) {
        new SendText().execute(data);
    }

    public void disconnect() {
        new Disconnect().execute();
    }

    public boolean isConnected() {
        if (socket != null)
            return socket.isConnected();
        else return false;
    }

    private class Connect extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                socket = new Socket(IP, port);
                OutputStream out = socket.getOutputStream();
                output = new PrintWriter(out);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    private class SendText extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {
            output.println(params[0]);
            output.flush();
            return null;
        }
    }

    private class Disconnect extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

}

加速度计类的一部分:

public void onSensorChanged(SensorEvent event) {
        Sensor mySensor = event.sensor;

        if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            connection.sendText("x"+Float.toString(x)+"a");
            connection.sendText("y"+Float.toString(y)+"s");
            connection.sendText("z"+Float.toString(z)+"d");
        }
    }

我是否应该通过发送一些“ping”和“pong”文本来检测连接何时断开,然后重新连接?

或者也许最好只使用像这样的库: https://github.com/EsotericSoftware/kryonet

该应用程序将用于小型车辆的远程控制。

最佳答案

您在一个套接字上使用多个异步任务程序,这导致了您所描述的问题。

您应该为每个 asynctasker 实现一个套接字。摆脱连接和断开连接异步类,只需在单个异步任务类的 doInBackground 中完全实现“Connect”->“SendText”->“Disconnect”即可。

或者您应该实现一个队列,并将所有信息放入一行,并实现一个服务,通过使用单个套接字发送文本来处理该行,例如“连接”->“处理行记录”->“断开连接”。

关于java - Socket发送大量数据时会自动关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610957/

相关文章:

java - 如何使用 WebDriver 更改文本区域中的文本

java - 动画时 JPanel 与 JFrame

android - 在 activity_main.xml 中看不到元素布局 android studio

android - 从 OnPostExecute(异步)更新 UI

c++ - 用 C 编写 Linux 服务器的最佳方法(phtreads、select 或 fork?)

java - 匈牙利算法 - 从中​​选择 0 的最后一步,使得每行和每列只选择一个

java - Spring 3.1 : Have Multiple @Qualifier References Point to Same Bean ID

android - Android 中的按钮动画

node.js - ZMQ 发布/订阅订阅

objective-c - c写函数没有正确发送字节