利用Tcp协议在Qt里面实现通信,注意:客户端和服务端的网段必须在同一个网段才可以,要不然连接不上。并且改代码能够解决中文乱码问题。字符串、中文都可以发送。 服务器端代码: 首先在.pro文件加入:
QT += core gui #原先就有
QT += network #这个是我们要加的
在qt里面我们使用了控件功能,做的比较捡漏
mainwindow.h代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_listen_clocked_clicked();
void on_send_clocked_clicked();
void on_textEdit_destroyed();
void server_New_Connect();
private:
Ui::MainWindow *ui;
QTcpServer* server;
QTcpSocket* socket;
};
#endif // MAINWINDOW_H
mainwindow.c文件代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
server = new QTcpServer();
ui->lineEdit_2->setText("8765");
ui->send_clocked->setEnabled(false);
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
}
MainWindow::~MainWindow()
{
server->close();
delete ui;
}
void MainWindow::on_listen_clocked_clicked()
{
if(ui->listen_clocked->text() == tr("侦听"))
{
//从输入框获取端口号
int port = ui->lineEdit_2->text().toInt();
//监听指定的端口
if(!server->listen(QHostAddress::Any, port))
{
//若出错,则输出错误信息
qDebug()<<server->errorString();
return;
}
//修改按键文字
ui->listen_clocked->setText("取消侦听");
qDebug()<< "Listen succeessfully!";
}
else
{
socket->abort();
//取消侦听
server->close();
//修改按键文字
ui->listen_clocked->setText("侦听");
//发送按键失能
ui->send_clocked->setEnabled(false);
}
}
void MainWindow::server_New_Connect()
{
//获取客户端连接
socket = server->nextPendingConnection();
//连接QTcpSocket的信号槽,以读取新数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::on_textEdit_destroyed);
//发送按键使能
ui->send_clocked->setEnabled(true);
qDebug() << "A Client connect!";
}
void MainWindow::on_send_clocked_clicked()
{
socket->write(ui->textEdit_2->toPlainText().toLocal8Bit());
socket->flush();
}
void MainWindow::on_textEdit_destroyed()
{
QByteArray buffer;
//读取缓冲区数据
buffer = socket->readAll();
if(!buffer.isEmpty())
{
ui->textEdit->setText(QString::fromLocal8Bit(buffer));
}
}
接下来是客户端的代码: 控件图片如下
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::on_read_destroyed);
ui->lineEdit->setText("192.168.31.49");
ui->lineEdit_2->setText("8765");
}
MainWindow::~MainWindow()
{
delete this->socket;
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString IP;
short port;
IP = ui->lineEdit->text();
port = ui->lineEdit_2->text().toShort();
socket->abort();
socket->connectToHost(IP,port);
if(!socket->waitForConnected(30000))
{
qDebug() << "Connection failed!\n";
return;
}
qDebug() << "Connection successfully!";
}
void MainWindow::on_pushButton_2_clicked()
{
QString str = ui->write->toPlainText(); //从文本框中取出字符串
socket->write(str.toLocal8Bit());
socket->flush();
}
void MainWindow::on_read_destroyed()
{
QByteArray buffer;
buffer = socket->readAll();
if(!buffer.isEmpty())
{
ui->read->setText(QString::fromLocal8Bit(buffer));
}
}
void MainWindow::on_write_destroyed()
{
}
mainwindow.h的代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_read_destroyed();
void on_write_destroyed();
private:
Ui::MainWindow *ui;
QTcpSocket* socket;
};
#endif // MAINWINDOW_H
客户端上位机界面,最后结果如下:
服务器端界面如下: