gpt4 book ai didi

Java套接字服务器客户端到客户端文件传输

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:34 26 4
gpt4 key购买 nike

我不确定我想做的事情是否可行。我想要一个套接字服务器运行,多个客户端可以连接到它。客户端 A 将一个文件拖放到他的 GUI 上,客户端 B 会收到一个弹出窗口,询问他是否想要接收该文件。如果同意,客户端A开始上传文件,客户端B直接开始下载文件。这可能吗?应该先将文件传输到服务器吗?如果我将文件发送到服务器,它可以工作,但是当我尝试将文件发送到客户端 B 时,我会得到以下信息:

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
}
}

最佳答案

I want a socket server to run, multiple clients can connect to it. Client A drags and drops a file onto his GUI and client B gets a popup asking if he wants to receive the file. If agreed client A starts uploading the file and client B starts downloading the file directly. Is this possible? should the file first be transferred to the server?

是的,如果情况允许的话,这是可能的。

假设客户端A发起Socket连接,那么客户端B的IP地址必须是客户端A可寻址的。如果客户端B有一个公共(public)IP地址,或者客户端A的网络有路由到一个私有(private)IP地址,那么就可以了。但是,客户端 B 有一个私有(private) IP 地址,而客户端 A 无法路由到它,那么它就无法工作,并且您需要一个公共(public)服务器(两者都可以访问)来中继数据。

另一件事是,没有防火墙阻止客户端 A 到客户端 B 尝试使用的端口上的连接。

<小时/>

您的部分堆栈跟踪似乎来自发起客户端(客户端 A),并表明连接尝试未通过。鉴于异常的性质,我认为最可能的解释是防火墙阻止了连接。

(如果这是路由问题,或者服务器没有监听指定端口,您会看到不同的异常...)

<小时/>

旁白:

  1. 变量名以大写字母开头是不好的风格;例如输入输出。样式规则规定 InOut 应该是类名。

  2. 术语“上传”和“下载”通常不用于描述“点对点”传输;例如两个客户端之间。

关于Java套接字服务器客户端到客户端文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24182610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com