socket传送大文件

windowboy 2008-12-29 07:10:49
现在用socket传送的文件,我都写在服务器的缓冲btye[size]中,因为传送的时候知道文件大小。
如果文件太大的时候,数据接收就有问题。对于传送的文件格式是:

数据字段\0(\0是分割符号)
附件名1\0(\0是分割符号)size1(附件大小,这个是10位的)文件1内容 附件名2\0(\0是分割符号)size2(附件大小,这个是10位的)文件1内容

现在不能一次全部读到内存中,读取是一次读取 byte[1024]
请问,我这样读取 byte[1024],怎么样把数据字段,附件都分离出来。

这个是文件的操作了。哪位高手能否指点一下。谢谢!
...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
windowboy 2009-02-17
  • 打赏
  • 举报
回复
谢谢,问题已经解决
East271536394 2009-02-12
  • 打赏
  • 举报
回复
import java.net.*;
import java.io.*;
public class NetTransFileSocket{
private static InputStream in=null;
private static OutputStream out=null;
private static File file=null;
private static URL url=null;
private static URLConnection conn=null;
public static void main(String [] args){
System.out.println("start transFile `````");
try{
file=new File("老人与海.mp3");
url=file.toURL();
conn=url.openConnection();
in=conn.getInputStream();
out=new FileOutputStream("f:/aa.mp3");
int length=0;
byte[] buffer=new byte[1024*2];
while((length=in.read(buffer,0,buffer.length)) !=-1){
out.write(buffer,0,length);
}
out.close();
in.close();
}catch(Exception se){
se.printStackTrace();
}


}
}
TinyJimmy 2008-12-29
  • 打赏
  • 举报
回复
首先你的掌握几个基础
1.文件读写
2.通过byte[]读写数据流
3.socket通信

然后搞清楚你的协议. 可分为两个部分
1.握手. 交换文件信息,包括文件名,文件长度等. 可以定长包, 也可使用开始/结束符以区分完整的消息段
2.数据传输. 客户端读取数据,通过socket流, 服务器接受, 保存到文件.

只要你找我以上几个关键点,相信你能写出个很棒的socket通信程序
xuhaiyang 2008-12-29
  • 打赏
  • 举报
回复
FileChannel或RandomAccessFile
glglglglglgllll 2008-12-29
  • 打赏
  • 举报
回复
LS说的很对
云上飞翔 2008-12-29
  • 打赏
  • 举报
回复
答:由于文件太大不能一次读入内存.显然,对于接收方来说,同样是不能将接收到的数据都暂存在内存中.因此:
我想楼主要将两个问题分开:
首先,接收方将所有的数据(大文件)通过byte[1024]一次又一次地接收下来,保存到接收方的文件中
然后:再对这个文件进行格式分析
(即:数据字段\0(\0是分割符号 附件名1\0(\0是分) ...等等) ,进行数据的分离.
最好不要将两者混在一起做.

81,094

社区成员

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

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