[英]Check if Server is up without exception
我想检查某个IP端口是否已在Java中为Android应用程序打开。
这是调用的代码:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RetreiveFeedTask Check=new RetreiveFeedTask();
try{
Work=(Check.execute(Exec, ServerIP, ServerPort)).get();
ALL.setText(Work);//Display what is returned
}
catch(Exception e)
{e.printStackTrace(); }
if(Work.equal("xyz")
{
//Do Stuff
}
else
{
//Do Other Stuff
}
}
});
异步代码:
class RetreiveFeedTask extends AsyncTask<String , String , String > {
//private Exception e;
String GotBack="3";
@Override
protected String doInBackground(String... params) {
try{
Socket s= new Socket(params[1], Integer.parseInt(params[2]));
s.close();
}
catch(Exception e){e.printStackTrace(); return "3";}
try{
Socket socket = new Socket(params[1], Integer.parseInt(params[2]));
PrintWriter output = new PrintWriter(socket.getOutputStream());
BufferedReader input=new BufferedReader(new InputStreamReader(socket.getInputStream()));
output.println(params[0]);
output.flush();
String read="";
while((read=input.readLine())!=null)
{
GotBack=read;
}
socket.close();
}
catch(SocketException e){e.printStackTrace(); }
catch(Exception e){e.printStackTrace();}
return GotBack;
}
}
目前,当我按下该按钮时,该按钮会冻结...
我检查{ServerIP1-ServerPort1}是否接受连接,如果不需要的话。
我假设您两次调用Asynctask,第一次是使用普通服务器,第二次是使用备份服务器。 现在尝试此操作,并指定两个服务器和两个端口来启动AsyncTask,即BackgroundTask(NrmSrvAddress,NrmSrvPort,bckSrvAddress,bckSrvPort); 然后使用以下功能连接到服务器:(我还没有运行代码,这只是一个想法)
public Socket ConnectToServer(String normalSrv, int nrmPort, String backupSrv, int bckPort)
{
// Let's try to connect to the Normal Server first.
try
{
Socket retSocket = new Socket();
InetAddress addr = InetAddress.getByName(normalSrv);
SocketAddress sockaddr = new InetSocketAddress(addr, nrmPort);
retSocket.connect(sockaddr, 30000); // 30 seconds timeout
return retSocket;
}
catch (Exception e)
{
// can't connect to the Normal Server
e.printStackTrace();
}
// Normal server is down, let's try to connect to the Backup Server.
try
{
Socket retSocket = new Socket();
InetAddress addr = InetAddress.getByName(backupSrv);
SocketAddress sockaddr = new InetSocketAddress(addr, bckPort);
retSocket.connect(sockaddr, 30000); // 30 seconds timeout
return retSocket;
}
catch (Exception e)
{
// can't connect to the Backup Server
e.printStackTrace();
}
// none of the server are available
return null;
}
// Then, in your AsyncTask:
@Override
protected String doInBackground(String... params) {
Socket socket = ConnectToServer(params[1], Integer.parseInt(params[2]), params[3], Integer.parseInt(params[4]));
if (socket != null)
{
try{
PrintWriter output = new PrintWriter(socket.getOutputStream());
BufferedReader input=new BufferedReader(new InputStreamReader(socket.getInputStream()));
output.println(params[0]);
output.flush();
String read="";
while((read=input.readLine())!=null)
{
TheData=read;
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
socket.close();
}
return TheData;
哦,我知道了,您尝试在OnClick事件中执行AsyncTask并希望Main线程等待其完成? 那不是使用AsyncTask的方式。 您应该使用AsyncTask的onPostExecute方法来处理返回值。 这就是为什么您的按钮冻结。
我可以提出以下建议:
在按钮的OnClick事件中创建一个新线程。 无论如何,如果您想使用AsyncTask,请阅读有关它及其工作原理的信息。
在该线程(或后台进程)中尝试连接到“常规服务器”,如果失败,请尝试备份服务器。
主要思想是我在“ ConnectToServer”之前发布的代码上,您必须进行部分操作,首先尝试连接到普通服务器并返回其获得的套接字,而不是直接返回套接字即可。 如果连接失败,请对备用服务器执行相同的操作。
如何在客户端代码中捕获java.net.SocketException
异常。 如果服务器已关闭,则应获取SocketException
具体取决于您可以随后决定连接到辅助服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.