日期:2014-05-20  浏览次数:20699 次

用socket做一个C/S模型传输文件
用socket做一个C/S模型传输文件,文件分成8份,client发送请求。server会response给client。我有哪几个文件。然后传输那几个部分。

这种要怎么做。。。超级小白啊。。求教。。

------解决方案--------------------
探讨

你如果懂java socket的基本原理 然后 就把文件通过io字节流读到内存里面。然后根据你自己程序设置传输字节的多少来传输这些字节就ok了。。 注意的是 不是一次性把一个文件传输给客户端,而是分段(每段传多少字节 你自己定义) 然后客户端,服务端自己拟定协议区分 文件传输开始 文件传输结束,然后客户端保存这个文件。。

------解决方案--------------------
Socket传文件,C/S模式,有好多实现方案可供选择。

如果,楼主只想传输一个小文件(三百K一下),可以参考我的博文:
使用ObjectOutputStream或ObjectInputStream传输文件

如果楼主传输的是大文件,或者说,要一个文件分好几次传输(传说中的伪断电续传),
那相对来说就比较复杂了。
------解决方案--------------------
简单文件下载协议:
一、功能概述:
C/S模式,文件存放在服务端的某个固定文件夹下面,客户端与服务端进行TCP连接,下载文件。
二、通信方式:
客户端每次下载操作,服务端都会创建一个会话,下载完毕后,会话关闭。
每次下载操作,客户端与服务端用进行多次的信息交互。
 交互过程是:
0.客户端与服务端建立TCP连接。
1.客户端发起下载文件请求,服务端生成Session,应答请求,告诉客户端文件是否可供下载。
2.客户端发起数据请求,服务端应答数据。(我们把文件数据,拆分成小块,多次传输)
3.重复步骤2,直到文件的所有数据下载完成。
4.传输完成,客户端断开TCP连接。

三、数据包格式:
下载操作,一共用到三种数据包,每种数据包,又分为请求包和应答包,
所以,应该要用到六个格式的数据包。
数据包由包头和包体组成,每个数据包的包头数据必须存在,包体有的有,有的没有。

数据包的包头共12个字节,包头数据的格式如下:
1. type 4byte 数据包的类型,标识六种数据包的哪一种。
2. sessionId 4byte 会话ID,由服务端产生,用于标识一个会话。
3. bodyLength 4byte 包体长度,没有包体则为零。标识包体的长度(字节数)。

数据包的包体,由于类型不同,也各不一样。
A. DownloadFileRequest (请求下载文件)
1. length 4byte 字符串的编码以后所占字节的长度。
2. data (length)byte 字符串的数据,字符串编码后的数据。
B. DownloadFileResponse (应答文件状态信息)
1. errorCode 4byte 错误代码,正常情况为零。 
2. fileStatus 4byte 文件状态,文件是否存在,是否可供下载,等等。
3. fileLength 8byte 文件长度,待下载文件的长度。
C. DownloadFileDataRequest (请求下载文件数据)
1. offset 8byte 文件数据的起始位置
2. length 4yte 文件的数据长度
D. DownloadFileDataResponse (应答下载文件数据)
1. errorCode 4byte 错误代码,正常情况为零。
2. offset 8byte 文件数据的起始位置
3. length 4byte 文件数据的长度
4. data (length)byte 文件的数据
E. ListFileNamesRequest (请求文件列表)
无包体数据
F. ListFileNamesResponse (应答可供下载的文件列表)
1. errorCode 4byte 错误代码,正常情况为零。
2. number 4byte 字符串数组中,字符串的个数
3. data 长度要根据情况 (data本身,也是一个数据块,由两个部分构成)
Struct data{
2.1 length 4byte 字符串的编码以后所占字节的长度。
2.2 data (length)byte 字符串的数据,字符串编码后的数据。
}

备注:
1. 上述六个数据包当中,E、F两个数据包,是用于协议功能扩充的,初期版本,可以不做考虑。
2. 本协议采用定长包头,变长包体的方式进行数据的传输与解析。
3. 数据包总的数据是连续的,包头数据与包体数据直接,不存在其他数据。