qt-socket
/* .pro文件 */
QT += network
tcp
服务端
/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QTcpServer *servSock;
QTcpSocket *listenSock;
private slots:
void myGetNewConnect();
void myGetNewRead();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
};
#endif // WIDGET_H
/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置默认值
ui->lineEdit->setText("127.0.0.1"); // ip
ui->lineEdit_2->setText("8080"); // port
// 创建套接字
servSock=new QTcpServer(this);
listenSock=new QTcpSocket(this);
ui->pushButton->setEnabled(false);
/* == version 1 == */
// 监听ip+port
// servSock->listen(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());
// connect(servSock,&QTcpServer::newConnection,this,&Widget::myGetNewConnect);
// ERROR!!! 必须保证已经建立连接了才能接收数据 建立信号和槽
// connect(listenSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead); // 在这创建信号和槽是错的
}
Widget::~Widget()
{
delete ui;
}
void Widget::myGetNewConnect()
{
// 返回一个套接字
listenSock=servSock->nextPendingConnection();
ui->textEdit->append("accept client socket connect request...");
// 必须在这创建信号和槽函数
connect(listenSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead);
}
void Widget::on_pushButton_clicked()
{
if (!listenSock->isOpen())
{
ui->textEdit->append("ERROR: no connect is usable...");
return;
}
QString sendText=ui->textEdit_2->toPlainText();
QByteArray sendArray=sendText.toUtf8();
listenSock->write(sendArray);
ui->textEdit->append("server to client: ");
ui->textEdit->append(sendText);
}
void Widget::myGetNewRead()
{
QByteArray readArray=listenSock->readAll();
ui->textEdit->append("client to server:");
ui->textEdit->append(readArray);
}
void Widget::on_pushButton_2_clicked()
{
/* == version 2 == */
servSock->listen(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());
connect(servSock,&QTcpServer::newConnection,this,&Widget::myGetNewConnect);
ui->pushButton_2->setEnabled(false);
ui->pushButton->setEnabled(true);
}
客户端
/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void myGetNewRead();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
QTcpSocket *clientSock;
};
#endif // WIDGET_H
/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setText("127.0.0.1");
ui->lineEdit_2->setText("8080");
clientSock=new QTcpSocket(this);
connect(clientSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
clientSock->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toUInt());
ui->textEdit->append("connect server: "+ui->lineEdit->text()+":"+ui->lineEdit_2->text());
}
void Widget::myGetNewRead()
{
QByteArray readArray=clientSock->readAll();
ui->textEdit->append("server to client:");
ui->textEdit->append(readArray);
}
void Widget::on_pushButton_2_clicked()
{
if (!clientSock->isOpen())
{
ui->textEdit->append("ERROR: not connect the server");
return ;
}
QString sendText=ui->textEdit_2->toPlainText();
QByteArray sendArray=sendText.toUtf8();
clientSock->write(sendArray);
ui->textEdit->append("client to server: ");
ui->textEdit->append(sendText);
}
udp
接收端
/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_2_clicked();
void myGetNewRead();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QUdpSocket *recvSock;
QHostAddress sendAddress;
quint16 sendPort;
};
#endif // WIDGET_H
/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setText("127.0.0.1");
ui->lineEdit_2->setText("8080");
ui->lineEdit_3->setText("127.0.0.1");
setWindowTitle("receiver");
recvSock=new QUdpSocket(this);
connect(recvSock,&QUdpSocket::readyRead,this,&Widget::myGetNewRead);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_2_clicked()
{
// 绑定端口号
recvSock->bind(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());
ui->textEdit->append("bind "+ui->lineEdit->text()+":"+ui->lineEdit_2->text());
}
void Widget::myGetNewRead()
{
QByteArray recvArray;
// version 1
// pendingDatagramSize 表示收到的数据的大小
long recvSize=recvSock->pendingDatagramSize();
recvArray.resize(recvSize);
// version 2
// char *p_recvArray=new char[recvSize];
// memcpy(p_recvArray,recvArray.data(),recvSize);
recvSock->readDatagram(recvArray.data(),recvArray.size(),&sendAddress,&sendPort);
QString info=QString("sender to receiver [%1 : %2 -> %3 : %4]").arg(sendAddress.toString()) \
.arg(QString::number(sendPort)) \
.arg(ui->lineEdit->text()) \
.arg(ui->lineEdit_2->text());
ui->textEdit->append(info);
ui->textEdit->append(recvArray);
ui->lineEdit_3->setText(sendAddress.toString());
ui->lineEdit_4->setText(QString::number(sendPort));
}
void Widget::on_pushButton_clicked()
{
QByteArray sendArray;
sendArray=ui->textEdit_2->toPlainText().toUtf8();
recvSock->writeDatagram(sendArray.data(),sendArray.size(),sendAddress,sendPort);
ui->textEdit->append("receiver to sender:");
ui->textEdit->append(sendArray);
}
发送端
/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_2_clicked();
void myGetNewRead();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QUdpSocket *sendSock;
QHostAddress recvAddress;
quint16 recvPort;
};
#endif // WIDGET_H
/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QString>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("sender");
ui->lineEdit->setText("127.0.0.1");
ui->lineEdit_2->setText("8080");
ui->lineEdit_3->setText("127.0.0.1");
ui->lineEdit_4->setText("8088");
sendSock=new QUdpSocket(this);
connect(sendSock,&QUdpSocket::readyRead,this,&Widget::myGetNewRead);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_2_clicked()
{
QByteArray sendArray;
sendArray=ui->textEdit_2->toPlainText().toUtf8();
if (sendSock->writeDatagram(sendArray,QHostAddress(ui->lineEdit->text()),ui->lineEdit_2->text().toInt())==-1)
{
ui->textEdit->append("ERROR: sender to receiver");
return ;
}
ui->textEdit->append("sender to receiver:");
ui->textEdit->append(sendArray);
}
void Widget::on_pushButton_clicked()
{
sendSock->bind(QHostAddress(ui->lineEdit_3->text()),ui->lineEdit_4->text().toUInt());
ui->textEdit->append("bind "+ui->lineEdit_3->text()+":"+ui->lineEdit_4->text());
}
void Widget::myGetNewRead()
{
QByteArray recvArray;
recvArray.resize(sendSock->pendingDatagramSize());
sendSock->readDatagram(recvArray.data(),sendSock->pendingDatagramSize(),&recvAddress,&recvPort);
QString info=QString("receiver to sender [%1 : %2 -> %3 : %4]").arg(recvAddress.toString()) \
.arg(QString::number(recvPort)) \
.arg(ui->lineEdit_3->text()) \
.arg(ui->lineEdit_4->text());
ui->textEdit->append(info);
ui->textEdit->append(recvArray);
}
其他例子
https://blog.csdn.net/qq_44386034/article/details/125637567
https://blog.csdn.net/cpp_learner/article/details/118223632
通用 - 补充例子
QString hostName=QHostInfo::localHostName();
// 打印主机名
qDebug()<<hostName;
// 本机的ip地址
QHostInfo hostInfo=QHostInfo::fromName(hostName);
// ip地址列表
QList<QHostAddress> addlist=hostInfo.addresses();
if (!addlist.isEmpty()){
for (int i=0;i<addlist.count();i++){
QHostAddress host=addlist.at(i);
qDebug()<<host.protocol(); // 显示ip协议类型
qDebug()<<host.toString(); // 显示ip
}
}
udp - 补充例子
void Widget::socket_readData_slot(){
QByteArray datagarm;
QHostAddress target_ipAddress;
quint16 target_port;
while (udpSocket->hasPendingDatagrams()){
datagarm.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagarm.data(),datagarm.size(),&target_ipAddress,&target_port);
ui->plainTextEdit->appendPlainText("received datagram form IP: "+target_ipAddress.toString()+":"+QString::number(target_port));
ui->plainTextEdit->appendPlainText(datagarm.data());
}
}
tcp
https://blog.csdn.net/qq_40876689/article/details/113952635
https://blog.csdn.net/mitongxue/article/details/124622386
https://blog.csdn.net/object__/article/details/122821061
/*
服务端
*/
#include <QTcpServer>
#include <QTcpSocket>
QTcpServer *tcpServer;
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,6666)
//连接信号和相应槽函数,有新的连接进入是需处理
// 有新的连接接过来,会触发newConnection()信号函数,触发槽函数NewConnection()
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(NewConnection())); // 信号与槽函数
// 槽函数
void Widget::NewConnection()
{
//初始化为0;
//blockSize=0;
// inBlock.resize(0);
//新连接进入的显示处理
// 取出连接号的套接字
currentClient = tcpServer->nextPendingConnection();
// QString ip=tcpsocket->peerAddress().toString();//获取连接的 ip地址
// quint16 port=tcpsocket->peerPort();//获取连接的 端口号
ui->statuslab->setText(tr("%1:%2").arg(currentClient->peerAddress().toString().split("::ffff:")[1]).arg(currentClient->peerPort()));
//客户端发来数据就会触发readyRead信号
connect(currentClient, SIGNAL(readyRead()), this, SLOT(recMessage()));
//对方断开连接后就会触发disconnected信号
connect(currentClient, SIGNAL(disconnected()), this, SLOT(disconnect()));
//当有数据发送成功时,继续发送???
connect(currentClient,SIGNAL(bytesWritten(qint64)),this, SLOT(continueSend(qint64)));
ui->sendButton->setEnabled(true);
}
离线
QFileDialog
QFile file(filename)
file.open(write/read)
QDataStream in(&file)
QByteArray data
in >> data
// coding...
setPixmap(QPixmap::fromImage(image))
在线
QDataStream in(client)
client->bytesAvailable()
in >> data >> string
QByteArray imagedata
imagedata +=client->readAll()
QBuffer buffer(&imagedata)
buffer.open(readtype)
QImageReader reader(&buffer,'jpg')
QImage image=reader.read()
image=image.scaled()
setPixmap(QPixmap::fromImage(image))