QtcpSocket使用笔记
1、在Pro文件中添加 QT += network,此处表示添加network这个模块,不过不加的话会提示找不到QtcpSocket 和QtcpServer类的头文件。添加了之后qmake会在MakeFile中自动生成所需要包含的头文件以及库文件。QtcpSocket和QTcpServer都是QIODevice的子类。
2、在服务器类中直接使用QtcpServer对象server的listen方法对指定端口和IP地址进行监听,当有客户端对其进行连接的时候出发newConnection信号,在此信号的处理中使用nextPendingConnection()接受待处理的连接。
3、QtcpSocket *nextPendingConnection()返回套接字指针来处理连接(TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口)。
4、Server一般使用事件循环,当使用waitForNewConnection()的时候会阻塞直到下个连接可用。
5、 Void close()关闭服务器
服务器端代码如下:
Widget.h
#ifndefWIDGET_H
#defineWIDGET_H
#include
#include
#include
namespaceUi{
classWidget;
}
classWidget:publicQWidget
{
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);
~Widget();
private:
Ui::Widget*ui;
QTcpSocket*socket;
QTcpServerserver;
privateslots:
voidnewConnection();
voidreadyR();
voidon_button_send_clicked();
};
#endif//WIDGET_H
Widget.cpp:
#include"widget.h"
#include"ui_widget.h"
#include
#include
Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);
ui->button_send->setEnabled(false);
server.listen(QHostAddress::Any,80100);
connect(&server,SIGNAL(newConnection()),this,SLOT(newConnection()));
}
Widget::~Widget()
{
deleteui;
}
voidWidget::newConnection()
{
socket=server.nextPendingConnection();
QMessageBox::about(this,tr("TCP"),tr("Connectedasserver"));
ui->button_send->setEnabled(true);
connect(socket,SIGNAL(readyRead()),this,SLOT(readyR()));
}
voidWidget::readyR()
{
//Iamreadytoread
QByteArrayarr=socket->readAll();
QStringmsg(arr);
ui->textEdit_recv->append(msg);
qDebug()<<"msg:"<<msg;
}
voidWidget::on_button_send_clicked()
{
QStringstr=ui->lineEdit_send->text();
str="CC: "+str;
QByteArraybty=str.toLocal8Bit();
socket->write(bty);
ui->textEdit_recv->append(bty);
}
客户端:
1、 客户端直接使用一个套接字对象的connectToHost()方法对指定的地址和端口进行连接。连接成功返回connected()信号。
2、 套接字对象连接成功之后当有数据可以读取的时候通过连接readyRead()信号来进行数据的接受操作(异步进行)。直接使用QbyteArrayQIODevice::readAll()方法来进行读取数据。
客户端代码如下:
Widget.h
#ifndefWIDGET_H
#defineWIDGET_H
#include
#include
#include
namespaceUi{
classWidget;
}
classWidget:publicQWidget
{
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);
~Widget();
private:
Ui::Widget*ui;
QTcpSocketsocket1;
privateslots:
voidon_button_send_clicked();
voidon_button_connect_clicked();
voidconnected();
voidreadData();
};
#endif//WIDGET_H
Widget.cpp
#include"widget.h"
#include"ui_widget.h"
#include
#include
#include
Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);
ui->button_send->setEnabled(false);
}
Widget::~Widget()
{
deleteui;
}
voidWidget::on_button_connect_clicked()
{
//点击链接
QStringstr;
str=ui->lineEdit_IP->text();
qDebug()<<"1"<<str;
socket1.connectToHost("172.16.89.63",80100,QTcpSocket::ReadWrite);
qDebug()<<"2";
connect(&socket1,SIGNAL(connected()),this,SLOT(connected()));
}
voidWidget::connected()
{
ui->button_send->setEnabled(true);
qDebug()<<"Socketconnectedasclient";
connect(&socket1,SIGNAL(readyRead()),this,SLOT(readData()));
}
voidWidget::readData()
{
QByteArrayarr=socket1.readAll();
ui->textEdit_recv->append(arr);
}
voidWidget::on_button_send_clicked()
{
QStringstr=ui->lineEdit_send->text();
str="DD: "+str;
QByteArrayarr;
arr=str.toLocal8Bit();
socket1.write(arr);
ui->textEdit_recv->append(arr);
}
客户端代码中在Windows下使用套接字对象指针进行连接时程序直接崩溃,使用套接字对象直接进行操作可以运行。
最近开始写点笔记记录一下近期QT学到的内容,也方便以后不记得再来查看。