• 7588阅读
  • 12回复

[提问]tcp多线程服务器如何转发信息 [复制链接]

上一主题 下一主题
离线jsjs2001
 
只看楼主 倒序阅读 楼主  发表于: 2012-06-02
最近写网络聊天程序,写到了多线程服务器。服务器与每个连接的客户端都创建一个线程来处理客户端的请求(每个线程建立对应的QTcpSocket)。但现在出现问题是一个客户端给另一个客户端发信息的时候。服务器如何去转发这个信息呢???我试了写方法但都行不通,想要发信息只能调用接收信息客户端的线程中的QTcpSocket去发信息。这点怎么去实现呢??请各位大神指教
离线xie133
只看该作者 1楼 发表于: 2012-06-02
最好的办法是通过服务器获取对方公网IP以及端口,然后发送给你,你就可以直接对他通信,当然,如果有NAT墙这样肯定不行,需要服务器帮你窗墙,这个就复杂了,说也说不清。
通过服务器中转也是可以的,每个用户多有一个ID号,你可以每个主线程与次线程多关联一个槽,然后当发送信息过来的时候将信息丢给主线程,让他去找匹配的次线程,并将消息发送出去。不过用QT做服务端效果肯定不好,只能自己玩的时候用下。
离线jsjs2001
只看该作者 2楼 发表于: 2012-06-02
这种方法我试过了呢,建立了一个QMap。存储了描述符套接字和线程指针,但是发信号发现槽函数总是在主线程执行。蛮杯具的
离线xie133
只看该作者 3楼 发表于: 2012-06-02
当信号与槽不在同一个线程的时候,默认的连接方式确实会让槽函数在主线程执行,这样不好吗?信号会发送到队列中,也就是异步的过程。Qt::BlockingQueuedConnection你可以使用这种连接方式,次线程会堵塞在发送信号的那里,等到槽函数执行完再继续往下走。
离线jsjs2001
只看该作者 4楼 发表于: 2012-06-02
呵呵,现在的问题就是在一个次线程中通过信号-->槽函数进入另一个线程去调用tcpsocket。但是现在总是在主线程中执行呢。
离线xie133
只看该作者 5楼 发表于: 2012-06-02
从槽函数在发送一个信号另一个线程, 另一个线程的槽函数执行的时候不就在另一个线程了。
离线jsjs2001
只看该作者 6楼 发表于: 2012-06-02
原来是这样啊,你的意思是没法实现在一个次线程调用另一个次线程的socket了。晕,那我不是彻底杯具了,那有没有什么办法来转发信息呢???
离线xie133
只看该作者 7楼 发表于: 2012-06-02
你在一个次线程里面根本连接不到另外一个线程,当然不可以调用,至少需要主线程帮你转一次,然后主线程帮两个次线程做一次连接。意思和我前面说的服务器给两个客户端做一次穿墙一样。
离线jsjs2001
只看该作者 8楼 发表于: 2012-06-02
好的 谢谢你了啊。 我再去试试
离线jsjs2001
只看该作者 9楼 发表于: 2012-06-02
回 7楼(xie133) 的帖子
我已经试过了,其实在次线程也可以连接另一个次线程,当然前提是找到要连接的那个线程的指针。还是很感谢你了,折腾了我蛮久的。
离线xie133
只看该作者 10楼 发表于: 2012-06-04
你找的过程就是主线程帮你找的,也就是我说要的主线程帮你做一次连接。
离线jsjs2001
只看该作者 11楼 发表于: 2012-06-05
呵呵,我不是用主线程找的哦 我建立套接字和thread指针的QMap 然后将套接字描述符存入数据库,所以根据查找套接字描述符就可以得到对应的线程指针,然后发信号,进入要调用的线程。
离线jsjs2001
只看该作者 12楼 发表于: 2012-06-05
查找的过程也是在次线程中,感觉使用线程最好用movetothread的方法会比较好,利于信号-槽函数的调用。
快速回复
限100 字节
 
上一个 下一个