转载自:https://blog.csdn.net/u014695839/article/details/70041771/
(3)使用write函数向服务器发送数据
(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
void MainWindow::socket_Read_Data()
{
QByteArray buffer;
//读取缓冲区数据
buffer = socket->readAll();
}
(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)
socket->disconnectFromHost();
2、以下是客户端的例程
(2)侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port)
(4)使用socket的write函数向客户端发送数据
socket->write(data);
(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据 QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); void MainWindow::socket_Read_Data()
{
QByteArray buffer;
//读取缓冲区数据
buffer = socket->readAll();
}
(6)取消侦听
2、以下是服务器的例程
一、客户端
1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:
(1)创建QTcpSocket套接字对象
socket = new QTcpSocket();
socket->connectToHost(IP, port);
(3)使用write函数向服务器发送数据
socket->write(data);
(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
{
QByteArray buffer;
//读取缓冲区数据
buffer = socket->readAll();
}
(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)
socket->disconnectFromHost();
2、以下是客户端的例程
首先是mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include "QMainWindow "
#include "QString"
#include "QtNetwork/QTcpSocket"
#include "QDebug"
#include "QByteArray"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_Connect_clicked();
void on_pushButton_Send_clicked();
void socket_Read_Data();
void socket_Disconnected();
private:
Ui::MainWindow *ui;
QTcpSocket *socket;
};
#endif // MAINWINDOW_H
然后mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
socket = new QTcpSocket();
//连接信号槽
QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);
QObject::connect(socket,&QTcpSocket::disconnected,this,&MainWindow::socket_Disconnected);
ui->pushButton_Send->setEnabled(false);
ui->line_ip->setText("127.0.0.1");
ui->line_port->setText("8765");
}
MainWindow::~MainWindow()
{
delete this->socket;
delete ui;
}
void MainWindow::on_pushButton_Connect_clicked()
{
if (ui->pushButton_Connect->text() == tr("连接"))
{
QString IP;
int port;
IP = ui->line_ip->text();
port = ui->line_port->text().toInt();
//取消已有的连接
socket->abort();
//连接服务器
socket->connectToHost(IP,port);
//等待连接成功
if (!socket->waitForConnected(30000))
{
qDebug()<<"connect error!";
return ;
}
qDebug()<<"successful!";
//使发送按键可选取
ui->pushButton_Send->setEnabled(true);
//修改按键文字为断开
ui->pushButton_Connect->setText("断开连接");
}
else
{
//断开连接
socket->disconnectFromHost();
ui->pushButton_Connect->setText("连接");
ui->pushButton_Send->setEnabled(false);
}
}
void MainWindow::on_pushButton_Send_clicked()
{
qDebug()<<"Send"<<ui->text_send->toPlainText();
//文本内容以ASCII码形式发送
socket->write(ui->text_send->toPlainText().toLatin1());
socket->flush();
}
void MainWindow::socket_Read_Data()
{
QByteArray buffer;
//读取缓冲区内容
buffer = socket->readAll();
if (!buffer.isEmpty())
{
QString str = ui->text_recv->toPlainText();
str += tr(buffer);
//刷新显示
ui->text_recv->setText(str);
}
}
void MainWindow::socket_Disconnected()
{
//发送按键无法选取
ui->pushButton_Send->setEnabled(false);
ui->pushButton_Connect->setText("连接");
qDebug()<<"Disconnect!";
}
UI设计: 控件的名字记得按照自己的,需要自己手动设置UI文件,添加槽函数,源码是不能直接复制用的。
二、服务器
1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:
(1)创建QTcpSever对象
server = new QTcpServer();(2)侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port)
(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
void MainWindow::server_New_Connect()
{ //获取客户端连接
socket = server->nextPendingConnection();
}
void MainWindow::server_New_Connect()
{ //获取客户端连接
socket = server->nextPendingConnection();
}
(4)使用socket的write函数向客户端发送数据
socket->write(data);
(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据 QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); void MainWindow::socket_Read_Data()
{
QByteArray buffer;
//读取缓冲区数据
buffer = socket->readAll();
}
(6)取消侦听
server->close();
2、以下是服务器的例程
首先是mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include "QMainWindow "
#include "QtNetwork/QTcpServer"
#include "QtNetwork/QTcpSocket"
#include "QDebug"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_send_clicked();
void on_pushButton_listen_clicked();
void server_New_Connect();
void socket_Read_Data();
void socket_Disconnected();
private:
Ui::MainWindow *ui;
QTcpServer *server;
QTcpSocket *socket;
};
#endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->line_port->setText("8765"); ui->pushButton_send->setEnabled(false); server = new QTcpServer(); connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect); } MainWindow::~MainWindow() { server->close(); server->deleteLater(); delete ui; } void MainWindow::on_pushButton_send_clicked() { qDebug()<<"Send:"<<ui->text_send->toPlainText(); //获取文本内容并发送 socket->write(ui->text_send->toPlainText().toLatin1()); socket->flush(); } void MainWindow::on_pushButton_listen_clicked() { if (ui->pushButton_listen->text() == tr("监听")) { int port = ui->line_port->text().toInt(); //监听指定端口 if (!server->listen(QHostAddress::Any, port)) { qDebug()<<server->errorString(); return ; } ui->pushButton_listen->setText("取消监听"); qDebug()<<"Listen successful!"; } else { if (socket->state()==QAbstractSocket::ConnectedState) socket->disconnectFromHost(); server->close(); ui->pushButton_listen->setText("监听"); ui->pushButton_send->setEnabled(false); } } void MainWindow::socket_Read_Data() { QByteArray buffer; //读取缓冲区数聚 buffer = socket->readAll(); if(!buffer.isEmpty()) { QString str = ui->text_recv->toPlainText(); str += tr(buffer); //刷新显示 ui->text_recv->setText(str); } } void MainWindow::socket_Disconnected() { ui->pushButton_send->setEnabled(false); qDebug()<<"Disconnect!"; } void MainWindow::server_New_Connect() { //获取客户端连接 socket = server->nextPendingConnection(); //连接QTcpSocket的信号槽,以读取新数据 QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data); QObject::connect(socket,&QTcpSocket::disconnected,this,&MainWindow::socket_Disconnected); ui->pushButton_send->setEnabled(true); qDebug()<<"A client connect"; } UI设计: