2014-06-12 226 views
1

我不知道我想要做什麼是可能的。 我想要一個套接字服務器運行,多個客戶端可以連接到它。客戶端A將文件拖放到他的GUI上,並且客戶端B得到一個彈出框詢問他是否想要接收該文件。如果同意的客戶端A開始上傳文件,並且客戶端B開始直接下載文件。這可能嗎?應該首先將文件傳輸到服務器?如果我將文件發送到它的工作原理服務器,但是當我嘗試將文件發送到客戶端BI得到如下:Java套接字服務器客戶端到客戶端文件傳輸

java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:241) 

這裏是上傳類:

public Upload(String addr, int port, File filepath, OpenChatFrame frame) { 
     super(); 
     try { 
      file = filepath; 
      ui = frame; 
      socket = new Socket(InetAddress.getByName(addr), port); 
      Out = socket.getOutputStream(); 
      In = new FileInputStream(filepath); 
      length = file.length(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() { 
     try { 
      byte[] buffer = new byte[1024]; 

      int count; 

      ui.jProgressBar1.setMaximum((int) length); 

      while ((count = In.read(buffer)) >= 0) { 
       Out.write(buffer, 0, count); 
       bytes += count; 
       ui.jProgressBar1.setValue(bytes); 

      } 
      Out.flush(); 


      if (In != null) { 
       In.close(); 
      } 
      if (Out != null) { 
       Out.close(); 
      } 
      if (socket != null) { 
       socket.close(); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

這裏是下載類:

public Download(String saveTo, OpenChatFrame ui) { 
    try { 
     server = new ServerSocket(0); 
     port = server.getLocalPort(); 
     this.saveTo = saveTo; 
     this.ui = ui; 
    } catch (IOException ex) { 
     //TODO: catch 
    } 
} 

@Override 
public void run() { 
    try { 
     socket = server.accept(); 
     System.out.println("Download : " + socket.getRemoteSocketAddress()); 

     In = socket.getInputStream(); 
     Out = new FileOutputStream(saveTo); 

     byte[] buffer = new byte[1024]; 
     int count; 

     while ((count = In.read(buffer)) >= 0) { 
      Out.write(buffer, 0, count); 
     } 

     Out.flush(); 

     File physicalFile = new File(saveTo); 
     System.out.println("FILE FILENAME: " + physicalFile.getName()); 
     System.out.println("saveTo: " + saveTo); 


     if (Out != null) { 
      Out.close(); 
     } 
     if (In != null) { 
      In.close(); 
     } 
     if (socket != null) { 
      socket.close(); 
     } 
    } catch (Exception ex) { 
     //TODO: catch 
    } 
} 

回答

1

我想一個socket服務器來運行,多個客戶端可以連接到它。客戶端A將文件拖放到他的GUI上,並且客戶端B得到一個彈出框詢問他是否想要接收該文件。如果同意的客戶端A開始上傳文件,並且客戶端B開始直接下載文件。這可能嗎?應該首先將文件傳輸到服務器?

是的,它是可能的,如果情況允許它。

假設客戶端A啓動Socket連接,則客戶端B的IP地址必須可由客戶端A尋址。如果客戶端B具有公共IP地址或客戶端A的網絡具有到其的路由的專用IP地址,則你還行。但是,客戶端B具有私有IP地址,客戶端A無法路由到它,因此無法工作,並且您需要一個公用服務器(兩者均可訪問)來中繼數據。

所需要的另一件事是,有沒有防火牆阻止對客戶端B端口上,他們正試圖利用從客戶端A連接。


您的部分堆棧跟蹤似乎來自啓動客戶端(客戶端A),並且指示連接嘗試未通過。鑑於例外的性質,我認爲最可能的解釋是有一個防火牆阻止了連接。

(如果這是一個路由的問題,或者如果服務器沒有在指定的端口上偵聽,你會看到不同的異常...)


旁白:

  1. 用大寫字母開始變量名是不好的風格;例如InOut。樣式規則說InOut應該是類名。

  2. 術語「上載」和「下載」通常不用於描述「對等網絡」轉移;例如在兩個客戶之間。

相關問題