创建socket
将socket与指定的ip和端口绑定(bind())
让socket在绑定的端口处监听请求(listen())
客户端成功连接服务端(accept()),服务端收到客户端的套接字,套接字是客户端与服务端进行数据传输的媒介,每个客户端对应一个套接字
接受数据(recv())
发送数据(send())
断开连接(close())
首先要在生成的pro文件的qt模块那一行加上newwork
QT += core gui network
然后在头文件中加入下面两个头文件
#include<QTcpServer> #include<QTcpSocket>
在qt中,QTcpServer用于生成一个服务器对象,相当于上面的socket对象.
QTcpServer * server = new QTcpServer;
接下来就是bind()和listen()操作
connect(server,&QTcpServer::newConnection,this,[](){ //对信号的处理 }); //在有新的客户端连接时会发送slo_newConnection的信号,这是qt需要额外做的一步 server->listen(QHostAddress::Any,5555);//绑定和监听对应的端口,通过返回值查看成功与否
然后是生成和处理套接字
QTcpSocket * socket=server->nextPendingConnection();//在客户端连接上来时成为处理数据的套接字
套接字的读写数据用的是以下两个函数
write(const char *data); readAll();//
于是全部的代码如下
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QTcpSocket> #include<QTcpServer> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void slo_new();//用于对新连接的客户端响应的槽 void slo_dis();//用于对客户端断开连接相应的槽 void slo_rec();//接受消息 void on_pushButton_clicked();//与按钮关联用于发送消息 private: Ui::Widget *ui; void showmessage(const QString &);//及时更新消息到屏幕上 QTcpServer * server; QList<QTcpSocket*> list_sokets;//用于保存所有用户对应的socket,用qobject_cast方法来找到是哪个socket发送的信号 }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include<QDateTime> #include<QPushButton> #include<QHostAddress> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); server=new QTcpServer;//新建一个服务器对象 server->listen(QHostAddress::Any,6666);//监听对应的id和6666端口 connect(server,&QTcpServer::newConnection,this,&Widget::slo_new);//有新客户端连接将发出newconnection的信号 } void Widget::showmessage(const QString & str2) { QString str=QDateTime::currentDateTime().toString(); ui->textEdit->append(str+' '+str2); } void Widget::slo_new() { QTcpSocket * socket=server->nextPendingConnection();//读取新客户端对应的套接字 connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联读取信息的槽 connect(socket,&QTcpSocket::disconnected,this,&Widget::slo_dis);//关联客户端断开的槽 showmessage(QString::fromUtf8("新用户%1连接").arg(socket->peerAddress().toString())); list_sokets<<socket; } void Widget::slo_dis() { QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket showmessage(QString::fromUtf8("用户%1断开").arg(socket->peerAddress().toString())); list_sokets.removeOne(socket);//将这个socket从列表移除 socket->disconnect(socket,0,this,0);//断开连接 socket->deleteLater(); } void Widget::slo_rec() { QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket QString str=QString::fromUtf8(socket->readAll());//读取消息 showmessage(socket->peerAddress().toString()+":\n"+str); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { if(list_sokets.isEmpty()) { showmessage("没人"); return ; } for(auto socket :list_sokets) { socket->write(ui->lineEdit->text().toUtf8()); } }
创建socket
连接服务端
收发消息
断开连接
代码如下
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QTcpServer> #include<QTcpSocket> #include<QHostAddress> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void showmessage(const QString &);//及时更新消息到屏幕上 public slots: void slo_rec();//接受消息 private slots: void on_pushButton_2_clicked(); void on_pushButton_clicked(); private: Ui::Widget *ui; QTcpSocket * socket; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include<QString> #include<QDateTime> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); socket = new QTcpSocket; } Widget::~Widget() { delete ui; socket->close(); } void Widget::on_pushButton_2_clicked()//连接服务端 { socket->connectToHost(QHostAddress::LocalHost,6666);//第一个参数为本地主机地址 if(QTcpSocket::UnconnectedState==socket->state()) { showmessage(QString::fromUtf8("连接失败")); return ; } else showmessage(QString::fromUtf8("连接成功")); connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联服务端来接受新信息 } void Widget::slo_rec() { showmessage(QString::fromUtf8(socket->readAll())); } void Widget::showmessage(const QString & str2) { QString str=QDateTime::currentDateTime().toString(); ui->textEdit->append(str+' '+str2); } void Widget::on_pushButton_clicked() { socket->write(ui->lineEdit->text().toUtf8()); }