请帮助我了解套接字。我一直在通过插座将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与一个套接字一起使用,这会导致您描述的问题。

您应该为每个asynctasker实现一个套接字。摆脱Connection和Disconnection异步类,仅在单个asynctask类的doInBackground内部完全实现“ Connect”->“ SendText”->“ Disconnect”。

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

10-07 16:56
查看更多