0

我想检查某个 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} 是否接受连接,如果没有,我需要知道。

4

2 回答 2

1

我假设您调用 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 并希望主线程等到它完成?这不是使用 AsyncTask 的方式。您应该使用 AsyncTask 的 onPostExecute 方法来处理返回值。这就是您的按钮冻结的原因。

我可以提出以下建议:

  1. 在按钮的 OnClick 事件中创建一个新线程。如果您仍然想使用 AsyncTask,请阅读它以及它是如何工作的。

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

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

于 2013-05-03T12:51:06.820 回答
0

如何java.net.SocketException在您的客户端代码中捕获异常。如果服务器关闭,您应该得到一个SocketException取决于您可以决定连接到辅助服务器的信息。

于 2013-05-03T11:52:23.897 回答