Java中通过套接字进行文件传输,不会超出while循环
我正在尝试创建一个简单的服务器客户端程序,用户可以在其中上载和下载文件。我已经让套接字和流工作,我可以上传一个文件到服务器。但每当上传一个文件时,服务器端似乎陷入了读取流并将其转发到服务器文件的循环中Java中通过套接字进行文件传输,不会超出while循环,java,sockets,stream,Java,Sockets,Stream,我正在尝试创建一个简单的服务器客户端程序,用户可以在其中上载和下载文件。我已经让套接字和流工作,我可以上传一个文件到服务器。但每当上传一个文件时,服务器端似乎陷入了读取流并将其转发到服务器文件的循环中 InputStream in = clientSocket.getInputStream(); String filePath = "......." + op[1]; System.out.println(op[0] + ": " + file
InputStream in = clientSocket.getInputStream();
String filePath = "......."
+ op[1];
System.out.println(op[0] + ": " + filePath);
FileOutputStream out = new FileOutputStream(filePath);
byte[] bytes = new byte[16*1024];
int count;
while ((count = in.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
服务器代码:
InputStream in = clientSocket.getInputStream();
String filePath = "......."
+ op[1];
System.out.println(op[0] + ": " + filePath);
FileOutputStream out = new FileOutputStream(filePath);
byte[] bytes = new byte[16*1024];
int count;
while ((count = in.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
客户端代码:
InputStream in = clientSocket.getInputStream();
String filePath = "......."
+ op[1];
System.out.println(op[0] + ": " + filePath);
FileOutputStream out = new FileOutputStream(filePath);
byte[] bytes = new byte[16*1024];
int count;
while ((count = in.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
String filePath = "...."
+ path;
System.out.println("Attempting: " + filePath);
dos = new DataOutputStream(serverSocket.getOutputStream());
fis = new FileInputStream(filePath);
byte[] buffer = new byte[4096];
while (fis.read(buffer) > 0) {
dos.write(buffer);
}
dos.flush();
fis.close();
问题是程序在while循环中卡住了,因此服务器无法执行其他任何操作。没有错误或任何东西…您永远不会在客户端关闭流。在
dos.flush()之后添加dos.close()
谢谢,这让程序退出while循环。但是,客户端和服务器之间的套接字连接也已关闭。我想有一个程序,我可以上传连续3个文件,如果我关闭每次上传后,我将不得不再次连接插座。有没有办法解决这个问题,或者我应该只为每个请求连接到服务器?您可能需要定义一个协议,允许服务器识别文件边界。例如,您可以设置流,以便在发送每个文件之前确定文件大小。服务器读取循环需要考虑这一点。我假设您正在做一个学习练习,因为存在各种带有“现成”Java实现的文件传输协议。
InputStream in = clientSocket.getInputStream();
String filePath = "......."
+ op[1];
System.out.println(op[0] + ": " + filePath);
FileOutputStream out = new FileOutputStream(filePath);
byte[] bytes = new byte[16*1024];
int count;
while ((count = in.read(bytes)) > 0) {
out.write(bytes, 0, count);
}