2011-01-14 46 views
0

我有下面的代码片段:的ServerSocket接受的行为

if (servsock == null) { 
    System.out.println("HELLO1!"); 
    servsock = new ServerSocket(63456, 10); 
    System.out.println("HELLO2!"); 
} 
try { 
    System.out.println("HELLO3!"); 
    sock = servsock.accept(); 
} catch (Exception ex) { 
    if (servsock != null && !servsock.isClosed()) { 
     System.out.println("PICO1!"); 
     servsock.close(); 
    } 
    if (servsock != null && servsock.isClosed()) { 
     System.out.println("PICO2!"); 
     manager.log("SERVER SOCKET closed and nulled."); 
     servsock = null; 
    } 
    sock = servsock.accept(); 
} 
System.out.println("HELLO4!"); 
is = sock.getInputStream(); 
System.out.println("HELLO5!"); 
bis = new BufferedInputStream(is); 
System.out.println("HELLO6!"); 

此代码是在一个可运行的run()方法运行,当该文件已被转移,它应该停止所有的通信。

好奇的是,它不是一个循环。代码确实接受,不会产生文件传输,但我不明白为什么HELLO1再次出现在我的屏幕上。因此,第二次尝试再次运行此代码时,会给我“连接被拒绝”。

“10”是我的破解版,但原始代码从未使用过积压。

有什么建议吗?

运行执行以前的代码是:

final IClientInterface clientInterface = client.getClient(); 
final prgHolder = new ProgHolder(); 
Pong ftppong = new Pong(); 
ftppong.setFileNames(bout64.toByteArray()); 
ftppong.setDstFolder(dstFolder); 
prgHolder.setName("pong"); 
prgHolder.setTask(pong); 
Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      IClientInterface.execute(prgHolder); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

确切现在的问题是,当我到了新的ServerSocket(63456)命令时,客户端获得“连接被拒绝”,但该程序在遥远的PC中,是一个开阔而广阔的听众! “netstat”证实了这一点!

所以我重新从第二个窗口重新运行程序,传递所有HELLO消息并完成工作!

然后线程在远端PC停止,并解除端口63456!

为什么它作为代码失败,但接受传入的请求?

+0

好的,我找到了错误的确切点。它是在线程之后。在t.start()之后;我在这里做的事情是:“Socket sock = new Socket(”distantmaching“,63456);代码恰好在那里,在线程之后,根据理论,我应该设置服务器线程并且客户端与小的片段,对吗?看来它不起作用。 – hephestos 2011-01-17 12:44:40

+0

windows windows:没问题.Windows-Linux作为服务器接受连接,失败。 – hephestos 2011-01-17 14:20:41

回答

1

根据这段代码,你应该只看到HELLO1一次。然而,这段代码的调用者很可能处于循环中,否则就不会检查servsock的前一个值。

这是怎么回事?

servsock = null; 
} 
sock = servsock.accept(); 

当您收到异常时,请不要继续,因为它没有发生。

如果你想了解你的代码在做什么,我建议你使用调试器来遍历你的代码。