做自媒体必备的8个网站,电脑网页打不开但是有网什么原因,wordpress伪静态 iis,怎么做竞价托管针对之前的服务器#xff0c;如果子线程工作类里面需要使用socket发送消息#xff0c;必须要使用信号与槽的方法#xff0c; 先发送一个信号给父进程#xff0c;父进程调用socket发送消息#xff08;原因是QT防止父子进程抢夺同一资源#xff0c;因此直接规定父子进程不能… 针对之前的服务器如果子线程工作类里面需要使用socket发送消息必须要使用信号与槽的方法 先发送一个信号给父进程父进程调用socket发送消息原因是QT防止父子进程抢夺同一资源因此直接规定父子进程不能使用同一资源可能很片面但至少针对socket这个类是这样的因此为了更好的使用多线程TCP服务器下面介绍一种新的方法。
1、新建一个编译无错误的工程
2、在pro文件中加入network 3、新建两个类一个Worker类继承QObject一个TcpServer类继承QTcpServer 4、编辑服务器界面 5、给控件命名
6、查找本地有效的IPV4并用combox控件显示 QListQHostAddress ipAddressesList QNetworkInterface::allAddresses();for (int i 0; i ipAddressesList.size(); i) {if (!ipAddressesList.at(i).isNull()//IP地址是否为NULL ipAddressesList.at(i).toIPv4Address() ! 0//是否是IPV4地址){ui-IPComboBox-addItem(ipAddressesList.at(i).toString());}}
7、创建Server对象绑定连接服务器按钮和创建代码
#include tcpserver.h
TcpServer *tcpserver NULL;//TcpServer这个是自定义的服务器类void Widget::on_connectPushButton_clicked()
{if(ui-connectPushButton-text().contains(打开服务器)){tcpserver new TcpServer(); //实例化tcpserver对象tcpserver-listen( QHostAddress(ui-IPComboBox-currentText()),ui-portLineEdit-text().toInt());//进行IP地址与端口的监听ui-connectPushButton-setText(断开服务器);}else{tcpserver-close();ui-connectPushButton-setText(打开服务器);}
}8、当客户端被连接时TcpServer类会自己调用incomingConnection方法然后我们需要重写这个方法首先就是新建一个工作类然后把套接字文件符传送过去然后在构造函数初始化套接字
protected:void incomingConnection(qintptr socketDescriptor) override; //当客户端连接时被调用。
void TcpServer::incomingConnection(qintptr socketDescriptor)
{QThread *thread new QThread();Worker *worker new Worker(socketDescriptor);//socketDescriptor这个参数时套接字的描述符用于生成套接字socketconnect(thread, QThread::finished, thread, QThread::deleteLater); //释放线程资源worker-moveToThread(thread);thread-start();
}9、先修改工作类worker的构造函数将套接字描述符加入
public:explicit Worker(qintptr socketDescriptor,QObject *parent nullptr);Worker::Worker(qintptr socketDescriptor, QObject *parent): QObject{parent}
{m_socketDescriptorsocketDescriptor;m_tcpsocket new QTcpSocket(this);m_tcpsocket-setSocketDescriptor(m_socketDescriptor);
}
10、获取套接字之后开始处理读到的数据在工作类中建立读信号和槽函数关系
public slots:void onReadyRead();connect(m_tcpsocket,QTcpSocket::readyRead,this,Worker::onReadyRead);void Worker::onReadyRead()
{QByteArray data m_tcpsocket-readAll();m_tcpsocket-write(receive : data);
}12、编译通过且连接成功可以将收到的消息发给服务器 13、开始处理发送信息的消息首先Widget界面有一个发送按钮用于发送数据给客户端代码实际操作时发送信号给工作类处理
signals:void sendDataSignals(QString data);void Widget::on_sendPushButton_clicked()
{emit sendDataSignals(ui-sendPlainTextEdit-toPlainText());
}我们如何让Widget和worker工作类产生联系利用中间类TcpServer我们先将sendDataSignals信号发送到TcpServer类中利用connect信号转信号然后等待TcpServer发送 sendDataSignals信号时绑定Worker类的槽函数进行发送数据
connect(this,Widget::sendDataSignals,tcpserver,TcpServer::sendDataSignals);
connect(this,TcpServer::sendDataSignals,worker,Worker::sendData_slots);
void Worker::sendData_slots(QString data)
{m_tcpsocket-write(send : data.toUtf8()\r\n);
} 14、编译代码运行成功可以成功收发数据 15、当接收到数据后我们让其在网络数据接收窗口显示采用信号与槽的机制
void Worker::onReadyRead()
{QByteArray data m_tcpsocket-readAll();m_tcpsocket-write(i am server,receive : data\r\n);emit readDisplaySignals(QString::fromUtf8(data));
}
connect(worker,Worker::readDisplaySignals,this,TcpServer::readDisplaySignals);
connect(tcpserver,TcpServer::readDisplaySignals,this,Widget::readDataDisplay_slots);
void Widget::readDataDisplay_slots(QString data)
{QString strui-receivePlainTextEdit-toPlainText();//接收区之前的内容QDateTime nowtime QDateTime::currentDateTime();str [ nowtime.toString(yyyy-MM-dd hh:mm:ss) ] RX: ;//记录当前时间str str data \r\n;//当前接收最新消息ui-receivePlainTextEdit-setPlainText(str);
}
16、测试成功 17、完整工程代码
链接https://pan.baidu.com/s/1wqfFoLKSrARjDHIX0Y-diQ? 提取码生日