QTcpSocket和QTcpServer学习笔记

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学到的内容,也方便以后不记得再来查看。

你可能感兴趣的:(QTcpSocket和QTcpServer学习笔记)