[英]Java socket server client to client file transfer
我不確定我要做什么。 我希望套接字服務器運行,多個客戶端可以連接到它。 客戶端A將文件拖放到其GUI上,客戶端B彈出對話框詢問他是否要接收該文件。 如果達成協議,則客戶端A開始上傳文件,而客戶端B開始直接下載文件。 這可能嗎? 應該先將文件傳輸到服務器嗎? 如果我將文件發送到服務器,則可以正常工作,但是當我嘗試將文件發送到客戶端BI時,將獲得以下信息:
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
}
}
我希望套接字服務器運行,多個客戶端可以連接到它。 客戶端A將文件拖放到其GUI上,客戶端B彈出對話框詢問他是否要接收該文件。 如果達成協議,則客戶端A開始上傳文件,而客戶端B開始直接下載文件。 這可能嗎? 應該先將文件傳輸到服務器嗎?
是的,如果情況允許,這是可能的。
假定客戶端A啟動了Socket連接,則客戶端B必須可以對客戶端B的IP地址進行尋址。如果客戶端B具有公用IP地址,或者客戶端A的網絡可以路由到的專用IP地址,則可以。 但是,客戶端B有一個專用IP地址,客戶端A無法路由到它,然后它不能工作,並且您將需要一個公共服務器(兩個服務器都可以訪問)來中繼數據。
需要做的另一件事是,沒有防火牆阻止它們試圖使用的端口上的客戶端A到客戶端B的連接。
您的部分堆棧跟蹤似乎來自於發起客戶端(客戶端A),並指示連接嘗試未通過。 考慮到異常的性質,我認為最可能的解釋是有防火牆阻止了連接。
(如果這是路由問題,或者服務器未在指定的端口上偵聽,則會看到不同的異常...)
旁白:
用大寫字母開頭的變量名是不好的風格。 例如, In
與Out
。 樣式規則說In
和Out
應該是類名。
術語“上載”和“下載”通常不用於描述“對等”傳輸; 例如兩個客戶之間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.