[英]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.