@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();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秒执行一次程序,现在是报错后直接挂掉了,程序不走了,希望大侠来看看

解决方案 »

  1.   

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

  2.   

    这样?
    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;
    }
    }
      

  3.   

    呵呵,自己解决了,是由于没创建成功socket,就关闭,所以报错,关闭前判断socket不为空,并且socket没关闭,才进行关闭步骤。