软件环境: ubuntu
--------------------------------------------------------------------------------------------------------
最终效果图:
--------------------------------------------------------------------------------------------------------
注意:建好工程后在“.pro”文件中加上“Qt += network”
--------------------------------------------------------------------------------------------------------
服务端:
GUI界面设计:
--------------------------------------------------------------------------------------------------------
实现代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QtNetwork>
#include<QtNetwork/QTcpSocket>
#include<QtNetwork/QTcpServer>
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void init(); //初始化函数用于完成一些诸如建立信号与槽之间的联系和变量给初值的初始化工作。
private slots:
void on_send_clicked();
void newListen(); //建立TCP监听事件
void acceptConnection(); //接受客户端连接
void displayError(QAbstractSocket::SocketError); //显示错误信息
private:
Ui::MainWindow *ui;
QTcpSocket *tcpSocket;
QTcpServer *tcpServer;
};
#endif // MAINWINDOW_H
///
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
init();
}
void MainWindow::init()
{
timer = new QTimer;
this->tcpServer = new QTcpServer(this);
this->tcpSocket = new QTcpSocket(this);
newListen();
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//newConnection()用于当有客户端访问时发出信号,acceptConnection()信号处理函数
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
//当tcpSocket在接受客户端连接时出现错误时,displayError(QAbstractSocket::SocketError)进行错误提醒并关闭tcpSocket。
}
void MainWindow::on_send_clicked()
{
this->tcpSocket->write(ui->lineEdit->text().toLatin1());
//用于发送字符消息
}
void MainWindow::newListen()
{
//监听是否有客户端来访,且对任何来访者监听,端口为6666
if(!tcpServer->listen(QHostAddress::Any,6666))
{
qDebug()<<tcpServer->errorString();
close();
return;
}
}
void MainWindow::acceptConnection()
{
//当有客户来访时将tcpSocket接受tcpServer建立的socket
tcpSocket = tcpServer->nextPendingConnection();
}
void MainWindow::displayError(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket->errorString();
tcpSocket->close();
}
MainWindow::~MainWindow()
{
delete ui;
}
--------------------------------------------------------------------------------------------------------
客服端:
GUI界面设计:
--------------------------------------------------------------------------------------------------------
实现代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QtNetwork>
#include<QtNetwork/QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void init();
void newTCPConnect();//用于建立服务端与客户之间的连接函数
private:
Ui::MainWindow *ui;
QTcpSocket *tcpSocket;
private slots:
void revData(); //接收来自服务端的数据
void displayError(QAbstractSocket::SocketError);
};
#endif // MAINWINDOW_H
///
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
init();
}
void MainWindow::init()
{
this->tcpSocket = new QTcpSocket(this);
newTCPConnect();
//这里我是采用程序启动就自访问服务端(也可根据实际情况采用手动连接手动输入服务端ip的方式。)
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(revData()));
//readyRead()表示服务端发送数据过来即发动信号,接着revData()
进行处理。
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
}
void MainWindow::revData()
{
QString datas = tcpSocket->readAll();
//接收字符串数据。
ui->lineEdit->setText(datas);
//显示字符串数据。
}
void MainWindow::newTCPConnect()
{
tcpSocket->abort();
tcpSocket->connectToHost("127.0.0.1",6666);
//这里可以根据实际情况在用户界面上进行输入。
}
void MainWindow::displayError(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket->errorString();
tcpSocket->close();
}
MainWindow::~MainWindow()
{
delete ui;
}