• 5230阅读
  • 14回复

有关QTcpServer和Socket的 [复制链接]

上一主题 下一主题
离线clannadzy
 

只看楼主 倒序阅读 楼主  发表于: 2015-07-30
由两个client和一个server.    B client会每十秒向server发一个心跳.   A client 将根据UI的操作发送相应的结果给server.  server将这个结果转发给B client.
我想实现上面这个功能,请问应该如何做,大家能给点思路吗?
现有想法:由于B每十秒发一次socket,所以我把这个socket存起来,而且每十秒更新一次B的socket(旧socket disconnectFromHost,新socket插入到容器).等到A的socket到达后,server只需提取最新的B socket,然后把A socket里的数据原样写入B socket,以此完成转发.              但是当我B client 的socket保存起来后(此时还没有执行disconnectFromHost),server就再也不能接收B之后的socket了,因为我没有关闭之前的socket吗?Qt机制要求必须在关闭钱一个socket的情况下,才能继续接收该client的socket吗?
谢谢!
离线realfan

只看该作者 1楼 发表于: 2015-07-30
一个Server可以同时连接多个Client
A和B同时连接到Server
离线clannadzy

只看该作者 2楼 发表于: 2015-07-30
回 realfan 的帖子
realfan:一个Server可以同时连接多个Client
A和B同时连接到Server
 (2015-07-30 08:59) 

1.   这个是不是得用到线程呢?
2.   这样的话,我的UI操作的结果是不是得等B client发送心跳包时才能一并发出呢?这样不就不就只能没十秒操作转发一次啦,不知道我有没有理解对
离线dbzhang800

只看该作者 3楼 发表于: 2015-07-30
QTcpSocket 和 QTcpServer都是异步的,一般应用都不需要多线程。特别是你10多秒才一次心跳,就更不需要了。
离线realfan

只看该作者 4楼 发表于: 2015-07-30
回 clannadzy 的帖子
clannadzy:1.   这个是不是得用到线程呢?
2.   这样的话,我的UI操作的结果是不是得等B client发送心跳包时才能一并发出呢?这样不就不就只能没十秒操作转发一次啦,不知道我有没有理解对 (2015-07-30 09:29) 

只要B连在Server上,想什么时候发都可以
心跳包是B到Server上,与从Server发数据给B没什么关系
离线clannadzy

只看该作者 5楼 发表于: 2015-07-30
回 realfan 的帖子
realfan:只要B连在Server上,想什么时候发都可以
心跳包是B到Server上,与从Server发数据给B没什么关系 (2015-07-30 10:00) 

我好像有点明白啦
是这样的吗?,当server启动 ,B 也启动后, B第一次给server发送心跳时,B 的 IP和端口都被获取了,当A想让server转发时,只需要在server 的 newConnection对应的槽函数里实例化一个socket,然后将socket connect 到那个IP和Port 就行啦?  这次我理解对了吗?
离线realfan

只看该作者 6楼 发表于: 2015-07-30
回 clannadzy 的帖子
clannadzy:我好像有点明白啦
是这样的吗?,当server启动 ,B 也启动后, B第一次给server发送心跳时,B 的 IP和端口都被获取了,当A想让server转发时,只需要在server 的 newConnection对应的槽函数里实例化一个socket,然后将socket connect 到那个IP和Port 就行啦?  这次我理解对了吗? (2015-07-30 10:14) 

过程是这样的:
启动Server
A,B连接到Server
A发数据给Server
Server收到数据,发给B

不需要AB直接有联系
离线clannadzy

只看该作者 7楼 发表于: 2015-07-30
回 realfan 的帖子
realfan:过程是这样的:
启动Server
A,B连接到Server
A发数据给Server
....... (2015-07-30 10:19) 

我想问一下,一个socket被接收后,是不是必须要disconnectFromHost,才能继续接收下一个socket的?
离线realfan

只看该作者 8楼 发表于: 2015-07-30
回 clannadzy 的帖子
clannadzy:我想问一下,一个socket被接收后,是不是必须要disconnectFromHost,才能继续接收下一个socket的? (2015-07-30 14:58) 

QTCPServer可以同时连接多个客户端,不需要断开一个再连另一个。
离线clannadzy

只看该作者 9楼 发表于: 2015-07-30
回 realfan 的帖子
realfan:QTCPServer可以同时连接多个客户端,不需要断开一个再连另一个。 (2015-07-30 15:37) 

那一个server貌似不能对一个客户端同时开多个连接?我发现好像是这样的
离线clannadzy

只看该作者 10楼 发表于: 2015-07-30
回 realfan 的帖子
realfan:QTCPServer可以同时连接多个客户端,不需要断开一个再连另一个。 (2015-07-30 15:37) 

刚刚server不小心开了15分钟,发现终端在接收完第一次B发来的socket后,等了5min又接收到下次socket,我觉得这是超时了吧.这能说明一个服务器对一个客户端只能同时接收一个socket吧
离线realfan

只看该作者 11楼 发表于: 2015-07-31
回 clannadzy 的帖子
clannadzy:刚刚server不小心开了15分钟,发现终端在接收完第一次B发来的socket后,等了5min又接收到下次socket,我觉得这是超时了吧.这能说明一个服务器对一个客户端只能同时接收一个socket吧 (2015-07-30 16:19) 

参考 一下这个帖子
http://www.qtcn.org/bbs/read-htm-tid-54890.html
离线clannadzy

只看该作者 12楼 发表于: 2015-07-31
回 realfan 的帖子
realfan:参考 一下这个帖子
http://www.qtcn.org/bbs/read-htm-tid-54890.html (2015-07-31 00:06) 

先运行了一下,发现能满足要求,这下得好好研究研究了,为什么它的能保持长链接呢.谢谢版主!
离线clannadzy

只看该作者 13楼 发表于: 2015-07-31
回 dbzhang800 的帖子
dbzhang800:QTcpSocket 和 QTcpServer都是异步的,一般应用都不需要多线程。特别是你10多秒才一次心跳,就更不需要了。 (2015-07-30 09:49) 

看了别人的例子,的确没用线程,谢谢
离线clannadzy

只看该作者 14楼 发表于: 2015-07-31
回 realfan 的帖子
realfan:参考 一下这个帖子
http://www.qtcn.org/bbs/read-htm-tid-54890.html (2015-07-31 00:06)

我知道我的问题出在哪里了.之前我一直主动disconnect了client发来的socket,仔细想了想,其实我是被一种想法干扰了:既然B一直在发送心跳,server就需要不断更新B的socket,否则当Server用旧的B的socket就发送不出去(当时也没有写DEMO验证这一干扰想法).其实完全没必要,连上了就能用,没必要更新.关于"一个client同时只有能有一个socket连接到server某一个端口",版主提供的那个程序也没有实现,由此我判断server在监听某一个端口时,同一时间内只能和某一个IP进行一次socket连接.换就话说,当这个IP再次请求socket连接时,因为server已经存在一个和这个IP连接好的socket了,所以这次的请求将被无视(抛弃?反正就是不响应啦).自己总结,希望能帮到路过的朋友们.
再次谢谢两位版主!
快速回复
限100 字节
 
上一个 下一个