2011-01-14 59 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(); 

當您收到異常時,請不要繼續,因爲它沒有發生。

如果你想了解你的代碼在做什麼,我建議你使用調試器來遍歷你的代碼。

相關問題