请帮我理解套接字。我一直通过套接字将加速度计数据从 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/