求教一个关于TCP协议的问题

八品市长 发布于 2012/10/18 10:21
阅读 305
收藏 0

我初学Java 刚找到一份工作 经理要我做一个关于tcp传输协议的程序 我没有一点思路 希望各位大神能帮我理一理思路 不胜感激 协议如下:

一、概述

使用TCP协议实现传输文件程序分为发送端和接收端。文件传输过程如下:

1、 发送端开启监控TCP端口,接收端连接发送端TCP端口。

2、 接收端连接后,发送端会发送连接确认数据。

3、 接收端向发送端申请要接收的文件名称和开始接收文件的位置,这将支持断点续传。

4、 发送端会把将装有文件名称和文件长度等信息的数据包发送至接收端。

如果发送端没有此文件或者超出连接数,发送错误码。退出连接,这将无以下流程。

5、 接收端收到文件名称和文件长度信息后,判断有足够的存储空间,会创建好空白文件。

如果创建失败发送错误码,退出连接,这将无以下流程。

6、 接着开始传输文件数据,文件数据传送完成后,发送端将文件的校验码发送给接收端,校验码

7、 校验正确,退出连接。

二、传输数据格式

TCP端口:10200

以下数据均为大字序。

TCP数据定义

IP首部(系统打包)

TCP首部(系统打包)

TCP数据部分

20字节

20字节

应用程序打包

TCP数据部分定义

1.1.1 包结构

Byte0

Byte1

Byte 2~3

Byte 4~Byte7

包内容

包尾

0x7E(同步1)

0x7D(同步2)

预留

包长度

数据段

0x0D

以下是数据段定义:

1、 连接确认

方向:发送端à接收端

字节

数据内容

BYTE 0~3

0x0001

BYTE 4~7

预留

BYTE 8~11

发送端程序版本号

BYTE 12~15

协议版本号

BYTE 16~19

0x0000:连接允许

0:连接拒绝,表示下次连接时间间隔。单位为秒。避免被频繁连接。

2、 申请接收文件

方向:发送端ß接收端

字节

数据内容

BYTE 0~3

0x0002

BYTE 4~7

预留

BYTE 8~15

申请文件开始位置。单位:字节

如果是文件头开始接收,则为0

BYTE 16~N

申请文件名。

文件名以“0”结束。

文件名长度最多256个字节。

3、 申请确认

方向:发送端à接收端

字节

数据内容

BYTE 0~3

0x0003

BYTE 4~7

预留

BYTE 8~15

文件总长度。单位:字节。

如果文件没找到,则为0

BYTE 16~19

文件ID,即文件唯一标识。

传输文件时以文件ID作为标识。

BYTE 20~N

申请文件名。

文件名以“0”结束。

文件名长度最多256个字节。

4、 传输文件数据

方向:发送端à接收端

字节

数据内容

BYTE 0~3

0x0004

BYTE 4~7

预留

BYTE 8~11

文件ID

BYTE 12~19

文件总长度。单位:字节。

BYTE 20~27

当前数据块在文件中的位置。单位:字节。

BYTE 28~31

当前数据块长度。单位:字节。

BYTE 32~N

当前数据块内容。

5、 传输文件数据确认

方向:发送端ß接收端

字节

数据内容

BYTE 0~3

0x0005

BYTE 4~7

预留

BYTE 8~11

文件ID

BYTE 12~19

文件总长度。单位:字节。

BYTE 20~27

当前数据块在文件中的位置。单位:字节。

BYTE 28~31

当前数据块长度。单位:字节。

BYTE 32~35

0x0001:传输完成。

0x0002:传输失败,重发。

0x0003:传输失败,不重发。断开连接。

6、 传输文件完成

方向:发送端à接收端

字节

数据内容

BYTE 0~3

0x0006

BYTE 4~7

预留

BYTE 8~11

文件ID

BYTE 12~19

文件总长度。单位:字节。

BYTE 20~51

文件的MD5


我只做好了 发送端和接收端 的socket通信 拜求~~~~

加载中
0
Yisen
Yisen

发送的数据根据协议来做就好了啊

比如连接确认,定义一个20字节长的字符串,大端序的话:

send这个字符串就好了,不用管tcp的东西

八品市长
怎么把那个数据段内容打成包,也就是写成一个函数呀
0
阿桂爱清净
阿桂爱清净

既然你写好了之间的通信 

那你直接根据你发送的数据进行判断好了

阿桂爱清净
阿桂爱清净
利用类的封装性 定义一个类 序列化 里面定义各个数据段 每次发送这么一个实例
八品市长
怎么把那个数据段内容打成包 也就是定义成一个函数 怎么定义?
0
魔方帅帅
魔方帅帅

楼主,这里建议一下,

首先,你要做的跟TCP毫无关系,你千万别把自己绕进了TCP,你需要做的是自定义文件传输协议而已,只不过是通过TCP的链接来传输,你设计的时候,最好也能考虑到如果换一个链路来实现会如何。

其次,你可以参考下状态机模式,理清楚你需要完成的业务应该如何来分解。

0
mallon
mallon
参考FTP用两条连接实现,要简单得多
返回顶部
顶部