Android套接字重新连接到服务器
我正在构建一个android应用程序,它使用与计算机上Java服务器的连接。 我有一个问题-当我发现与服务器没有连接时,我试图重新连接到服务器,但它不工作。 以下是客户端类代码:Android套接字重新连接到服务器,android,sockets,android-asynctask,Android,Sockets,Android Asynctask,我正在构建一个android应用程序,它使用与计算机上Java服务器的连接。 我有一个问题-当我发现与服务器没有连接时,我试图重新连接到服务器,但它不工作。 以下是客户端类代码: public class Client extends AsyncTask { private final int port = 1978; private final String ip = "192.168.14.22"; private Socket socket; privat
public class Client extends AsyncTask {
private final int port = 1978;
private final String ip = "192.168.14.22";
private Socket socket;
private DataOutputStream output;
private DataInputStream input;
public Client() {
}
@Override
protected Object doInBackground(Object[] objects) {
try {
socket = new Socket(ip, port);
output = new DataOutputStream(socket.getOutputStream());
input = new DataInputStream(socket.getInputStream());
Log.d("Network c1", "Connected");
} catch (IOException e) {
socket = null;
Log.d("Network c1", "Not connected");
}
return null;
}
public boolean checkConnection() {
if (output == null)
return false;
try {
output.writeUTF("abc");
return true;
} catch (IOException e) {
return false;
}
}
@Override
protected void onProgressUpdate(Object[] values) {
}
}
以及活动代码:
public class LogInActivity extends AppCompatActivity {
Client client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log_in);
client = new Client();
client.execute();
//I used timer because it didn't work without it- That saied always 'not connected' message/Toast
new CountDownTimer(5, 0) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
check();
}
}.start();
}
private void check() {
boolean isProcess;
isProcess = !checkConnection();
if (isProcess) {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.Theme_AppCompat_Dialog_Alert);
builder.setTitle(getResources().getString(R.string.app_name));
builder.setMessage("Unable connect to the library");
builder.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//See note 1.
check();
}
});
builder.setCancelable(false);
builder.show();
}
}
public boolean checkConnection() {
if (client.checkConnection()) {
Toast.makeText(getApplicationContext(), "Connected to the library", Toast.LENGTH_SHORT).show();
return true;
} else {
Toast.makeText(this, "Unable connect to the library", Toast.LENGTH_SHORT).show();
return false;
}
}
}
注1:
问题就在这里
在连接服务器/库之前,需要显示此对话框
如果在应用程序打开之前服务器已打开,则检查方法工作正常,并显示“已连接成功”,对话框不会显示
但是如果当应用程序启动时,服务器无法访问,并且稍后打开并变得可以访问-检查方法不起作用,并且始终显示对话框
有什么问题
顺便说一下,我尝试重新启动客户机AsyncTask类,但没有成功。
我试着对它执行closetrue,然后在再次执行之后,cancel方法不起作用,这是一个错误,表示在AsyncTask类执行之后,它不能再次执行
谢谢。您不应该像在本代码中那样每隔几秒钟定期检查连接。 相反,你应该让操作系统为你做这件事,它将更可靠,更高效的电池和CPU方面
看一看你想在哪里重新连接?我又试过执行excute,但它不起作用。如何以其他方式重新连接?