gpt4 book ai didi

java - 检查服务器是否正常启动

转载 作者:行者123 更新时间:2023-12-01 14:37:22 25 4
gpt4 key购买 nike

我想检查某个 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,即后台任务(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 并希望主线程等待它完成?这不是 AsyncTask 的使用方式。您应该使用 AsyncTask 的 onPostExecute 方法来处理返回值。这就是你的按钮卡住的原因。

我可以提出以下建议:

  1. 在按钮的 OnClick 事件中创建一个新线程。如果您无论如何都想使用 AsyncTask,请阅读它及其工作原理。

  2. 在该线程(或后台进程)中尝试连接到“正常服务器”,如果失败,请尝试备份服务器。

主要思想是我在“ConnectToServer”之前发布的代码,你必须分开,第一个尝试连接到普通服务器并返回它获得的套接字,而不是返回套接字,只是在那里进行读取。如果连接失败,则在备份服务器上执行相同的操作。

关于java - 检查服务器是否正常启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16357976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com