发送大量数据时套接字会自行关闭吗?

时间:2015-11-09 14:08:06

标签: java android sockets

请帮我理解插座。我一直在通过套接字向PC发送加速度计数据到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;
        }
    }

}

Accelerometer类的一部分:

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

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

1 个答案:

答案 0 :(得分:0)

您正在使用多个asynctaskers和一个插槽,这会导致您所描述的问题。

你应该为每个asynctasker实现一个套接字。摆脱连接和断开asyncclasses,只需实现“连接” - &gt; “SendText” - &gt;在单个asynctask类中的doInBackground中完全“断开连接”。

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