请帮助我了解套接字。我一直在通过插座将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”。
或者,您应该实现一个队列并将所有信息放入一行中,并实现一种服务来通过使用单个套接字发送文本来处理该行,例如“连接”->“处理行的记录”->“断开连接”。