Qt 局域网聊天,QTcpServer,QTcpSocket,几处不懂,请教各位。

Scrg 2015-09-24 06:39:03
Qt局域网聊天,服务器端:

void TcpServerWidget::on_startServerButton_clicked()//点击开启服务器按钮
{
server = new QTcpServer;
server->listen(QHostAddress::Any,51234);
connect(server,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));
}

void TcpServerWidget::newConnectSlot()
{
socket = server->nextPendingConnection();
connect(socket,SIGNAL(readyRead()),this,SLOT(readMessageSlot()));
}

第二个函数中的:
socket = server->nextPendingConnection();我看了Qt的帮助文档,但是还是不是很懂,希望大家可以讲解。
另外:
当server监听到有连接时,就调用newConnectSlot()槽函数,如果调用了一次之后,再监听到了,也会调用这个槽函数,那第一次调用的槽函数是否就失效了?
我在电脑上测试了一下,是:
如果开启一个服务器端,两个客户端,那样第一个客户端就不能和服务器正常通信了。应该怎么做才能让多个客户端连接呢?
另外:
当我点击开启服务器按钮的时候,就调用了void TcpServerWidget::on_startServerButton_clicked()这个槽函数,然后这个槽函数去做:connect(server,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));连接信号和槽。
那我开启第二个客户端,连接服务器的时候,为什么也会使用到connect这个连接呢?没有地方使用到“开启服务器”按钮呀。
万分感激!
...全文
365 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scrg 2015-10-23
  • 打赏
  • 举报
回复
结贴。 server->listen(QHostAddress::Any,51234); 监听会一直进行。一旦有新的连接的时候,就会发出newConnection()信号, connect(server,SIGNAL(newConnection()),this,SLOT(newConnectSlot())); 就会有这个信号,触发新连接槽。 新连接槽中:socket = server->nextPendingConnection(); 返回一个读写套接字,这里,可以用一个容器来放读写套接字,这样就不会覆盖了。 connect(socket,SIGNAL(readyRead()),this,SLOT(readMessageSlot())); 这个连接是一直进行的,一旦读写套接字有可读内容就出发读取信息槽。 这是我的理解,如果有不正确的地方,非常希望能够指出,万分感激。
羽飞 2015-09-25
  • 打赏
  • 举报
回复
引用 2 楼 screenpage 的回复:
[quote=引用 1 楼 hnwyllmm 的回复:] 不知道楼主对TCP理解的怎么样 每次客户端连接到服务器,服务器都会收到一个连接事件,并且可以有多个客户端,所以服务器应该维护起来这多个客户端 void TcpServerWidget::newConnectSlot() { socket = server->nextPendingConnection(); connect(socket,SIGNAL(readyRead()),this,SLOT(readMessageSlot())); } 这个函数中socket是服务器收到的一个新的客户端连接,不知道楼主是怎么维护这个socket的,难道这个socket是一个成员变量? 那这样的话就把前面的连接丢掉了,应该用一个数据结构,比如最简单的数组,来维护这些连接
socket是一个成员变量的。你的意思是用一个数组来存放每次新的客户端连接吗? 那之后又怎么来启动这个connect()呢?因为下来我并不会再点击这个button的,也就是不会调用这两个函数。 但是我实际测的话,确实又是可以自动将客户端连接信号与槽连接在一起的。这个是Qt的什么原因吗?[/quote] QT不太了解啊 但是如果socket是成员变量,以后每次接收到客户端的连接,那前一个连接放在哪里? 你说的点击按钮是这个函数吧: TcpServerWidget::on_startServerButton_clicked()//点击开启服务器按钮 这个函数不就是开启服务器监听吗?点一次就可以了,TCP中的流程,服务器监听只需要调用一次,后面就可以接收多个客户端连接
Scrg 2015-09-24
  • 打赏
  • 举报
回复
引用 1 楼 hnwyllmm 的回复:
不知道楼主对TCP理解的怎么样 每次客户端连接到服务器,服务器都会收到一个连接事件,并且可以有多个客户端,所以服务器应该维护起来这多个客户端 void TcpServerWidget::newConnectSlot() { socket = server->nextPendingConnection(); connect(socket,SIGNAL(readyRead()),this,SLOT(readMessageSlot())); } 这个函数中socket是服务器收到的一个新的客户端连接,不知道楼主是怎么维护这个socket的,难道这个socket是一个成员变量? 那这样的话就把前面的连接丢掉了,应该用一个数据结构,比如最简单的数组,来维护这些连接
socket是一个成员变量的。你的意思是用一个数组来存放每次新的客户端连接吗? 那之后又怎么来启动这个connect()呢?因为下来我并不会再点击这个button的,也就是不会调用这两个函数。 但是我实际测的话,确实又是可以自动将客户端连接信号与槽连接在一起的。这个是Qt的什么原因吗?
羽飞 2015-09-24
  • 打赏
  • 举报
回复
不知道楼主对TCP理解的怎么样 每次客户端连接到服务器,服务器都会收到一个连接事件,并且可以有多个客户端,所以服务器应该维护起来这多个客户端 void TcpServerWidget::newConnectSlot() { socket = server->nextPendingConnection(); connect(socket,SIGNAL(readyRead()),this,SLOT(readMessageSlot())); } 这个函数中socket是服务器收到的一个新的客户端连接,不知道楼主是怎么维护这个socket的,难道这个socket是一个成员变量? 那这样的话就把前面的连接丢掉了,应该用一个数据结构,比如最简单的数组,来维护这些连接

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧