关于java socket传文件失败的问题

lcqaxxy 2017-09-20 04:28:20
socket服务端,发送文件
File newFile = new File("../../spa_client/" + appName);

long length = newFile.length();
System.out.println(appName + ":" + length);
oos.writeLong(length);
oos.flush();

String md5Str = DigestUtils.md5Hex(new FileInputStream(newFile));
oos.writeUTF(md5Str);
oos.flush();

if (SystemTray.isSupported()) {
textArea.append(appName + ":" + length+ "\n");
}

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(newFile)));
ps = new DataOutputStream(socket.getOutputStream());

int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int s = 0;
while (true) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
s += read;
}
if (read == -1) {
break;
}
ps.write(buf, 0, read);
ps.flush();

}
fis.close();

socket客户端,接收文件
File newFile = new File(fileName);
FileOutputStream fos = new FileOutputStream(newFile);
dis = new DataInputStream(socket.getInputStream());

String oldMd5 = ois.readUTF();

byte[] b = new byte[1024];
int length = 0;

if (SystemTray.isSupported()) {
textArea.append("Downloading " + runningFileName + "..." + "\n");
}
logger.info("Downloading the " + runningFileName + " from server");
System.out.println("Downloading the " + runningFileName + " from server");

int fileLong = 0;
while ((length = dis.read(b)) != -1) {
fileLong += length;
fos.write(b, 0, length);
fos.flush();

System.out.println(fileLong);
if (fileLong == fileLength) {
break;
}

}
fos.close();

有几个文件可以收到,但是有几个只收到一部分,这是怎么回事,我要发送接收多个文件的,求大神
...全文
833 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcqaxxy 2017-09-23
  • 打赏
  • 举报
回复
或者哪位精通socket的帮我修改一下代码,有偿
lcqaxxy 2017-09-22
  • 打赏
  • 举报
回复
.......
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
现在的问题是,我这里有两个接收端,一样的代码,就是其中一个多了从服务端接收md5值。然后服务端也有两个,一个是从网上下载文件下来发到客户端,一个是直接从本地发到客户端,本地的多了一个发送md5值。现在是从本地发的出错
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复

                  httpclient = HttpClients.custom().build();
							response = httpclient
									.execute(SendRecJsonUtil.downloadFile(ConvertUtil.updateURL, installUrl));
							entity = response.getEntity();

							byte[] buffer = new byte[1024];
							int size = 0;

							is = entity.getContent();
							bis = new BufferedInputStream(is);
							fos = new FileOutputStream(newFile);

							logger.info("Downloading the " + runningFileName + " from network");
							System.out.println("Downloading " + runningFileName);
							// save file

							while ((size = bis.read(buffer)) != -1) {
								fos.write(buffer, 0, size);
								fos.flush();
							}

							logger.info(runningFileName + " download complete");
							System.out.println("Download completed!Sending " + runningFileName);

							DataInputStream fis = new DataInputStream(
									new BufferedInputStream(new FileInputStream(newFile)));
							// DataOutputStream ps = new
							// DataOutputStream(socket.getOutputStream());

							long fileLength = newFile.length();
							oos.writeLong(fileLength);
							oos.flush();

							int bufferSize = 8192;
							byte[] buf = new byte[bufferSize];
							while (true) {
								int read = 0;
								if (fis != null) {
									read = fis.read(buf);
								}
								if (read == -1) {
									break;
								}
								ps.write(buf, 0, read);
							}
							ps.flush();

							fos.close();
							bis.close();
							is.close();
							fis.close();
							httpclient.close();
这是从网上下载文件下来再发送过去,同样的接收端,但这个却没问题
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
引用 3 楼 sanjuejianke 的回复:
你把 if (fileLong == fileLength) { break; } 这一行去掉看看
沒用,接收的字节只有原来一半都不到,比如文件是14000个字节,只接收了6000个字节就不动了,有几个文件是接收多了,原本文件大小是200个字节的接收了300个,所以很奇怪
sjjk 2017-09-21
  • 打赏
  • 举报
回复
引用 4 楼 lcqaxxy 的回复:
[quote=引用 3 楼 sanjuejianke 的回复:] 你把 if (fileLong == fileLength) { break; } 这一行去掉看看
沒用,接收的字节只有原来一半都不到,比如文件是14000个字节,只接收了6000个字节就不动了,有几个文件是接收多了,原本文件大小是200个字节的接收了300个,所以很奇怪[/quote] 你在发送文件的那一端不要关闭输出流,在接收端去关闭输入流,就可以了。因为如果你在发送文件的那一端关闭输出流,可能在另一端还没从输入流中读完所有数据的情况下就断开了,后续的数据当然就读不到了。
那场遇见 2017-09-21
  • 打赏
  • 举报
回复
帮顶。 ProjSolution
sjjk 2017-09-21
  • 打赏
  • 举报
回复
你把 if (fileLong == fileLength) { break; } 这一行去掉看看
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
引用 13 楼 miaoch 的回复:
[quote=引用 11 楼 lcqaxxy 的回复:] [quote=引用 9 楼 miaoch 的回复:] 看了你的错误描述,我有个问题要问你,如果两次写入的过程比较频繁,那接收端如何确定一个文件已经写入完毕了呢?我觉得这个可能就是你文件大小不定的原因
边读取边写入,但是读取的字节不对,当文件大小和读取到的字节相等就退出[/quote] 读取在服务端,服务端怎么可能直接知道文件的初始大小。。我看你的代码写的是什么oos,我也不知道具体是怎么用的。难道你又传了一个oos过去?[/quote] oos 是ObjectOutputStream,上面没贴出来的代码要用到,我是用oos把要发送的文件的大小发到客户端的,服务端是发送文件的
miaoch 2017-09-21
  • 打赏
  • 举报
回复
引用 11 楼 lcqaxxy 的回复:
[quote=引用 9 楼 miaoch 的回复:] 看了你的错误描述,我有个问题要问你,如果两次写入的过程比较频繁,那接收端如何确定一个文件已经写入完毕了呢?我觉得这个可能就是你文件大小不定的原因
边读取边写入,但是读取的字节不对,当文件大小和读取到的字节相等就退出[/quote] 读取在服务端,服务端怎么可能直接知道文件的初始大小。。我看你的代码写的是什么oos,我也不知道具体是怎么用的。难道你又传了一个oos过去?
sjjk 2017-09-21
  • 打赏
  • 举报
回复
你本地的服务端写完文件之后有没有关闭输出流呢?如果你关闭了,那么问题应该就是这里了,服务端不要关闭输出流
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
引用 10 楼 sanjuejianke 的回复:
你本地的服务端写完文件之后有没有关闭输出流呢?如果你关闭了,那么问题应该就是这里了,服务端不要关闭输出流
没关
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
引用 9 楼 miaoch 的回复:
看了你的错误描述,我有个问题要问你,如果两次写入的过程比较频繁,那接收端如何确定一个文件已经写入完毕了呢?我觉得这个可能就是你文件大小不定的原因
边读取边写入,但是读取的字节不对,当文件大小和读取到的字节相等就退出
miaoch 2017-09-21
  • 打赏
  • 举报
回复
看了你的错误描述,我有个问题要问你,如果两次写入的过程比较频繁,那接收端如何确定一个文件已经写入完毕了呢?我觉得这个可能就是你文件大小不定的原因
lcqaxxy 2017-09-21
  • 打赏
  • 举报
回复
。。。。。。
lcqaxxy 2017-09-20
  • 打赏
  • 举报
回复
有没有大神啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧