作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 java 服务器,可以将文件发送到 android 客户端。由于某种原因,服务器似乎只在一次通过后关闭套接字,我希望它发送所有文件然后关闭套接字,这是我的服务器代码。提前致谢
public void run() {
DataOutputStream dos = null;
try {
String path = "/home/test";
int count = 0;
dos = new DataOutputStream(
new BufferedOutputStream(socket.getOutputStream()));
DataInputStream dis = new DataInputStream(new BufferedInputStream(
socket.getInputStream()));
File[] files = new File(path).listFiles();
for (File file : files) {
String filename = file.getName();
String extension = filename.substring(
filename.lastIndexOf(".") + 1, filename.length());
if ("png".equals(extension)) {
count += 1;
}
}
System.out.println("Sending " + count + " files");
dos.writeInt(count);
dos.flush();
byte[] temp = new byte[1024];
int n = 0;
for (File file : files) {
String filename = file.getName();
String extension = filename.substring(
filename.lastIndexOf(".") + 1, filename.length());
if ("png".equals(extension)) {
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte fileContent[] = new byte[(int) file.length()];
bis.read(fileContent);
int dataLength = fileContent.length;
dos.writeInt(dataLength);
dos.flush();
int open = dis.readInt();
System.out.println("still open if open = 5: open = "+open);
System.out.println(filename + " is " + dataLength
+ " bytes long");
while ((dataLength > 0)
&& (n = bis.read(temp, 0,
(int) Math.min(temp.length, dataLength))) != -1) {
dos.write(temp, 0, n);
dos.flush();
dataLength -= n;
}
System.out.println("Sent file "+filename);
fis.close();
bis.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
try{
if (dos != null) {dos.close();}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
最佳答案
您的 Android 应用程序有可能正在旋转吗?您的代码中有逻辑错误。它将整个文件读入 fileContent
中,但随后您进入 while
循环等待文件被完全读取。
bis.read(fileContent);
...
while ((dataLength > 0)
&& (n = bis.read(temp, 0, (int) Math.min(temp.length, dataLength))) != -1) {
您已经从 bis
读取了整个文件,因此当您阅读更多内容时,您将得到 n == 0
,因此它会永远循环。
如果你想进行缓冲,那么你应该删除bis.read(fileContent);
。如果您想在开始时读取文件,那么您需要删除 while
循环。
int dataLength = (int) file.length();
byte fileContent[] = new byte[dataLength];
bis.read(fileContent);
dos.writeInt(dataLength);
dos.write(fileContent);
dos.flush();
dataLength -= n;
关于java - 线程化java服务器只发送一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733997/
我是一名优秀的程序员,十分优秀!