您的位置:首页 > 理论基础 > 计算机网络

P2P模式文件传输网络应用的开发

2015-06-22 23:56 501 查看
_

我设计的p2p系统包括用户登录模块、注册资源模块、下载资源模块;

服务端维护用户和资源信息,包括两张表(如下),其中src_name保存的是资源在注册用户机器上的绝对路径;

User

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| ip | varchar(20) | NO | PRI | NULL | |

| port | varchar(10) | YES | | NULL | |

| stat | varchar(3) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

Src

+----------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+--------------+------+-----+---------+-------+

| ip | varchar(20) | YES | | NULL | |

| src_name | varchar(50) | YES | | NULL | |

| src_path | varchar(300) | YES | | NULL | |

+----------+--------------+------+-----+---------+-------+

客户端拥有用户图形界面,用户登录时需要填写服务器IP、服务器PORT和本机监听PORT;注册资源时需要选择文件、填写资源名称;下载文件时需要填写查询的资源名称和文件监听PORT。

客户端-->服务器的协议形式:IP(客户自己的)+PORT(客户自己的)+act+src_name+src_path;其中act包括:login/logoff/upload/download/query;

服务器-->客户端的协议形式:resp – ip(其他结点的)+port(其他结点的)+src_name+src_path - …… - …… - ;其中resp为服务器返回给客户端的状态码,以便于客户端根据状态码进行处理和显示,包括:login_ok/logoff_ok/upload_ok/query_result/query_null/p2p;

PàP之间的协议形式:resp – ip(客户自己的) – port(客户自己的文件监听端口) – src_name – src_path;其中resp为p2p;

使用流程:用户输入服务器IP、服务器PORT和本机监听PORT后,点击上线按钮(有默认值),如果信息不完全或者连接有问题会弹出警示框;点击上线按钮后,其他功能模块的按钮才可以使用,即不再显示灰色,服务器IP、服务器PORT和本机监听PORT三个文本框不可编辑;

用户点击浏览,会弹出文件选择框,选择要上传的文件,确定后,文本框中显示出选中文件的路径和文件名,填写资源命名,如果为空弹出警示框;

如果用户希望下载资源,则在下载资源模块中输入资源名称,点击查询,如果有资源,则显示在下面的列表框中,用户选中希望下载的资源,再填写文件监听PORT,点击下载,会弹出文件夹选择框,确认后,开始下载,下载完成会提示用户,如果下载有问题,也会弹出相应警示框,如果没有资源,则列表框为空,并弹出警示框,告知用户无资源。

用户点击下线按钮后,其他可用的按钮变为不可用,除了上线按钮,并且服务器IP、服务器PORT和本机监听PORT三个文本框可编辑。

1. 文件类型

我发现java project编写socket网络文件传输,只要以txt文本存储都正常,而其他类型就会丢数据,导致下载的文件不完整;于是我想到了一个办法:将其他类型的文件作为txt类型下载下来,然后再进行类型转换成原有类型,删掉用于转换的txt临时文件;因为服务器已经反馈给客户端文件的绝对路径和文件名了,所以客户端可以判断文件类型,是否需要进行格式转换和转换为何种类型。

2. java写界面太麻烦

因为大二的时候用过socket编程,所以就在原来工程的基础上进行改动,改动很大,但是为了有原型可以参照,便还是使用java编写图形界面,但是确实很麻烦。

3. 用户非正常退出

这个问题目前没有解决,只提供了点击下线按钮,正常下线功能,原理是删除user表中的IP,使其他用户看不到该用户的资源。

4. 用户标识和资源存放问题

因为IP并不是和每台机器是一对一关系,所以用IP作为用户标识,并不是很合理;而且我实现的服务器维护的是资源在用户机器上的绝对路径,并没有考虑好如何能唯一标识一台机器;如果把资源上传到服务器,会增大服务器的负担,这样也不是p2p形式了;现在这种情况就是说,如果用户机器的IP改变,用户再登录系统,之前上传的资源就全部作废,除非使用原来的IP,而且绝对路径还不能变,会造成很大的局限性;所以这个部分在用户体验上还有很大的问题。

5.还有很重要的一条:各种流啊socket啥的,没用了记得close…否则会崩:被占用…

最后代码不传了,我怕别人用着用着就崩了,还是本着优生优育的原则吧,工程名p2p_exp4,eclipse打开,mark一下,有心情再改改吧……不过注定也是个有进步的豆腐渣工程……

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: