找回密码
 加入
搜索
楼主: itljl

TCP同时发送文件和信息只用一个socket的讨论

 火.. [复制链接]
 楼主| 发表于 2010-2-8 17:26:51 | 显示全部楼层
回复 15# crwmart

至少我现在看来是相当的难。因为我测试发现,客户端接收的时候,循环每次是收到64KB。而不是我们设定的发送多少字节,或者接收多少字节。

这又涉及到我们要在发送的时候构成一个数据包,在接收的时候,又要重新将TCP打乱的乱,重新组合起来。

或许有非常 简单的办法,只是我们不知道。
发表于 2010-2-8 18:08:26 | 显示全部楼层

评分

参与人数 1金钱 -20 贡献 -5 收起 理由
pusofalse -20 -5 提问区严禁无意义回复,扣分警告!

查看全部评分

 楼主| 发表于 2010-2-21 13:07:51 | 显示全部楼层
回复 17# rikthhpgf2005


    我居然灌水,来人拖出去
发表于 2010-2-22 17:01:51 | 显示全部楼层
发个我个人的想法。 不知道能不能实现。

TCP发送文件时候要将数据封装成包才发送。发送的数据包有个ID标识, 能不能从这个上面做文章?

比如,发送文件的时候,检测文件大小,然后除以每次发送的数据包大小,就得到了要发送的数据包个数。

然后,发送文件之前,先发送一个数据包个数包,告诉客户端,要发送多少个包。
然后客户端接受到数据包之后,对数据包处理。 只需要读出这是第几个包。就知道这个数据包是要干什的。

如果数据包ID属于文件的ID范围,则证明SOCKET连接发送的这个包是文件数据包。

服务器端再发送文字信息时候(不属于文件数据包),重新定义一个数据包ID。不要让这个ID处于文件数据包的ID范围内。 客户端接受到这个ID 就知道不是在发送文件了,处理完之后也就不会去关闭SOCKET连接。

直到文件数据包ID段发送完毕,才去关闭SOCKET。
发表于 2010-6-10 01:05:46 | 显示全部楼层
留个名。。明天再看
发表于 2010-6-10 11:26:25 | 显示全部楼层
实现起来容易啊,效率非常低下.
使用心跳式通讯.
对所有的通讯包进行特定封包.
服务端和客户端建立连接后.就不停的通讯.
空闲的时候,服务端会发送如:"心跳包........"
发完等待客户的回复后再做下一步操作,如果超时判定客户端已断开连接.
客户端可能回复:如果: " 心跳包........""当不做任何操作时.
下载文件时: "下载文件-文件名-起始字节-长度......" 当收到这样的封包,服务端打开文件并按起始字节和长度发送.发送完同样等待客户端的回应.
指令通讯时:"指令....... "

不管服务端还是客户端,都必须对封包做出处理这样效率极低.
说得好像有点乱,简单的说,就是服务端和客户端的通讯,是不停止的.每次通讯都是1来1往,发个包出去必须等到回应才发第2个包,这样不会出现对方收到的是2个包的累加.
下载一个文件可能要几百上千个来回.但可以保证下载文件的同时可以做其他通讯.

原理类似于WIN98的抢先式多任务.
发表于 2011-7-3 10:02:04 | 显示全部楼层
最近也在做TCP的封包,虽然是老贴,也回一下,贴上我的解决思路,以便后人查阅.
首先,要实现数据包的区分,要得先实现内部序列化,就是相当于自己封装一个协议.例如要发文本消息及传输文件的话就得定义两个指令ID,类似当下的QQ协议.
先说明一下,这里指令ID并不是单独发送,而是序列化后发送.关于序列化,大家可以GOOGLE相关的说明文档.
我所使用的方式是传输一个Struct结构,简单举个例子:
$tStruct = DllStructCreate('int iCmdId;int iLength; char szContent[4096]')
在这个结构体中,成员iCmdId表示当前的指令,如设置为1表示当前的数据是一条文本消息,设置为2表示当前的数据为文件数据流;成员iLength表示当前数据包的大小;成员szContent表示数据包的内容,当然,这个成员的大小是不确定的,上面的4096只是举例,类型也是可变的,关键在于你自己转换.这样一来,就可以将结构体前两个元素看作是数据包头,因为大小是固定的,总共为8个字节,想到了吧,只要在接收方接收时先接收前8个字节就可以知道这个数据包的大小及指令类型,前面说过,成员iLength是整个数据包的大小,现在我要接收完整个数据包的话还要接收iLength-8个字节.如此接收方不仅知道这一条数据包的处理方式,还可以保证数据包的完整性,同样避免了多次交互.
说得很乱,希望有人能理解,仅当抛砖引玉
另外,提醒一下,结构体是不能直接传送的,必须要先转换成字节流;结构体的成员也不能引用指针,因为地址只对于你自己有效.

评分

参与人数 1金钱 +10 收起 理由
jlet + 10 感谢思路。。

查看全部评分

发表于 2011-7-3 16:09:07 | 显示全部楼层
回复 14# itljl


发送和接收同一端口这样就行了,明天试试看看
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-21 03:14 , Processed in 0.075533 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表