日期:2014-05-19  浏览次数:20755 次

socket连接失败抛异常,希望继续执行。
Java code
    @Override
    public void run() {
        while (!bExit ) {
            try {
                System.out.println("kaishile");
                    send();
                    System.out.println("开始了,开始了");
                    Thread.sleep(15000);
            } catch( InterruptedException e) {
                e.printStackTrace();
            } 
        }
    }
,15秒执行一次send();
Java code

private void send() {
        try {
            if( client == null || client.isClosed()) {
                client = new Socket(InetAddress.getByName(mServerAddr),mServerPort);
                client.setSoTimeout(60000);
                client.setTcpNoDelay(true);
                outP = client.getOutputStream();            
                inP = client.getInputStream();
        
                _log.debug("new socket is created, device id is " +  mDeviceID);        
            }
} catch (IOException e) {
            System.out.println("报错了IOException");
            e.printStackTrace();
            _log.error("deviceID:" + mDeviceID + "  IOException ");
            try {
                outP.close();
                inP.close();
                client.close();
                client = null;
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
,我故意将地址写错,当创建socket失败时,就抛出报 错了IOException
java.net.ConnectException: Connection timed out: connect,这样就停止了,但是我想不管你是不是报错,我就15秒执行一次程序,现在是报错后直接挂掉了,程序不走了,希望大侠来看看。。。

------解决方案--------------------
暂时没看出什么大问题,不过:
你那么多的close(),居然不是写在finally里面?
你的client等变量,居然都是成员属性,而不是send()函数的局部变量?


------解决方案--------------------
这样?

Java code

class TestClient1 implements Runnable{
    Socket client = null;
    InetSocketAddress serverAddress = null;
    boolean bExit = false;
    
    public TestClient1(){
        this("127.0.0.1", 7777);
    }
    
    public TestClient1(String serverIp, int port){        
        this.serverAddress = new InetSocketAddress(serverIp,port);
    }
    
    @Override
    public void run() {
        for(int i=0;!bExit;i++){
            if(connect2Server()){
                //连接成功
            }else{
                System.out.println("连接失败,重试("+i+")...");
                try {
                    Thread.sleep(1000*15);
                } catch (InterruptedException e) {                    
                }
            }
        }
    }
    
    boolean connect2Server(){
        boolean done = false;
        
        try{
            client = new Socket();
            client.connect(serverAddress, 1000*60);
            client.setSoTimeout(60*1000);
            done = client.isInputShutdown() & client.isOutputShutdown();
        }catch(Exception ex){
            System.err.println("报错了:"+ex.getMessage());
            try{
                if(null!=client) client.close();
            }catch(Exception ex1){                
            }
            
            done = false;
        }
        
        return done;
    }
}