最近在写一个仿QQ的软件,通过多线程实现了多个客户端之间互相收发消息的功能。文件传输和消息发送的原理大致相同,都是根据我们自己定义的通信协议来进行。
工作原理:
客户端:
1.获取文件对象
2.与服务器建立连接
3.建立到服务器的输出流
4.根据通信协议发送文件
服务器端:
1.建立一个服务器等待客户端的连接
2.根据通信协议接收文件
3.将文件保存到指定目录下
我自己定义的通信协议:
1.客户端发送一个字节大小的数据(type),表示发送文件的类型(文件为2)
2.客户端发送一个int大小的数据(destNum),表示接收者的ID(以后实现用户间传送文件)
3.客户端发送一个int大小的数据(fileDateLen),表示文件的长度
4.客户端根据文件的长度,向输出流中写入文件的内容并发送给服务器
5.客户端发送一个int大小的数据(nameLen),表示文件名的长度(方便服务器根据文件名存储文件)
6.客户端根据文件名的长度,向输出流中写入文件名的内容并发送给服务器
服务器端只需根据通信协议进行接收即可
部分代码截图如下:
客户端发送文件部分:
[img]http://dl2.iteye.com/upload/attachment/0099/1651/1b9b4cc8-893e-3a70-a950-a9a2b518642f.jpg[/img]
服务器端接收文件部分:
[img]http://dl2.iteye.com/upload/attachment/0099/1653/69cce85e-e6e8-3357-a4c5-7c5dafc70dc7.jpg[/img]
工作原理:
客户端:
1.获取文件对象
2.与服务器建立连接
3.建立到服务器的输出流
4.根据通信协议发送文件
服务器端:
1.建立一个服务器等待客户端的连接
2.根据通信协议接收文件
3.将文件保存到指定目录下
我自己定义的通信协议:
1.客户端发送一个字节大小的数据(type),表示发送文件的类型(文件为2)
2.客户端发送一个int大小的数据(destNum),表示接收者的ID(以后实现用户间传送文件)
3.客户端发送一个int大小的数据(fileDateLen),表示文件的长度
4.客户端根据文件的长度,向输出流中写入文件的内容并发送给服务器
5.客户端发送一个int大小的数据(nameLen),表示文件名的长度(方便服务器根据文件名存储文件)
6.客户端根据文件名的长度,向输出流中写入文件名的内容并发送给服务器
服务器端只需根据通信协议进行接收即可
部分代码截图如下:
客户端发送文件部分:
[img]http://dl2.iteye.com/upload/attachment/0099/1651/1b9b4cc8-893e-3a70-a950-a9a2b518642f.jpg[/img]
服务器端接收文件部分:
[img]http://dl2.iteye.com/upload/attachment/0099/1653/69cce85e-e6e8-3357-a4c5-7c5dafc70dc7.jpg[/img]