開發環境:Windows10
Qt版本:Qt5.11.0
現在設計用戶端,服務端設計請參考位址:Qt實作區域網路簡易通信(一)
同樣先來看界面:
通過連接配接伺服器的IP和端口号連接配接伺服器,并能發送消息至伺服器。
同樣,先在.pro檔案裡添加網絡子產品
QT += core gui network
widget.h檔案代碼
#ifndef WIDGET_H
#define WIDGET_H
#include <QDebug>
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
#include <QNetworkInterface>
#include <QtCore/QObject>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_But_socket_lianjie_clicked();
void on_Btn_socket_send_clicked();
void oneProcessConnected(); //連接配接成功函數
void oneProcessReadyRead(); //讀取伺服器資訊函數
void oneProcessDisconnected(); //伺服器斷開函數
void oneProcessError(QAbstractSocket::SocketError err); //出錯函數
private:
Ui::Widget *ui;
QTcpSocket *myClient; //定義用戶端對象
void InitSocket(); //初始化用戶端函數
};
#endif // WIDGET_H
widget檔案代碼
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
InitSocket();
}
Widget::~Widget()
{
delete ui;
}
void Widget::InitSocket()
{
myClient = new QTcpSocket(this); //配置設定空間
}
//連接配接伺服器槽函數
void Widget::on_But_socket_lianjie_clicked()
{
QString serveIP = ui->Edit_serve_IP->text(); //擷取伺服器IP
QString servePort = ui->Edit_serve_Port->text(); //擷取伺服器端口号
myClient->connectToHost(QHostAddress(serveIP),servePort.toInt()); //連接配接伺服器
//myClient->connectToHost("192.168.85.1",10086);
connect(myClient,SIGNAL(connected()),this,SLOT(oneProcessConnected())); //連接配接成功
connect(myClient,SIGNAL(readyRead()),this,SLOT(oneProcessReadyRead())); //讀取伺服器資訊資料
connect(myClient,SIGNAL(disconnected()),this,SLOT(oneProcessDisconnected())); //伺服器斷開
connect(myClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(oneProcessError(QAbstractSocket::SocketError))); //出錯函數
}
//連接配接成功函數
void Widget::oneProcessConnected()
{
QString msg = QString("謝天謝地,可算是連上伺服器了!");
ui->textEdit_serve->append(msg);
}
//讀取伺服器資訊函數
void Widget::oneProcessReadyRead()
{
QString msg,str1,str2;
str1 = QString("伺服器[%1:%2] 說:").arg(myClient->peerAddress().toString()).arg(myClient->peerPort());
while(!myClient->atEnd())
{
str2.append(QString(myClient->readAll()));
}
msg = QString("%1%2").arg(str1).arg(str2);
ui->textEdit_serve->append(msg);
}
//伺服器斷開函數
void Widget::oneProcessDisconnected()
{
QString msg = "伺服器退出 ";
ui->textEdit_serve->append(msg);
}
//出錯函數
void Widget::oneProcessError(QAbstractSocket::SocketError err)
{
qDebug() << err;
}
//點選發送按鍵向伺服器發送資訊
void Widget::on_Btn_socket_send_clicked()
{
QString msg = ui->textEdit_socket->toPlainText();
int ret = myClient->write(msg.toUtf8());
if(ret <= 0)
{
return;
}
ui->textEdit_socket->clear();
}
總結一下用戶端編寫步驟:
1、使用connectToHost(QHostAddress(serveIP),servePort.toInt())連接配接伺服器;
2、使用信号函數readyRead()讀取伺服器的資料資訊;
3、點選發送按鍵調用myClient->write(msg.toUtf8())向伺服器發送資料資訊。
至此,一個簡易的區域網路通信完成了,現結合伺服器來看看運作效果
同時運作伺服器和用戶端代碼,界面顯示如下:
此截屏将伺服器和用戶端放一起,上面為伺服器,下面為用戶端,手動輸入IP位址和端口号,點選伺服器的綁定,用戶端點選連結,看資訊框提示的資訊便知伺服器和用戶端連接配接成功。
檢視資訊發送功能
在用戶端輸入“你好”,點選發送,便在伺服器端出現“你好”,将從用戶端擷取的IP位址和端口号填入伺服器的用戶端接口,輸入資訊并點選發送,同樣,在用戶端接收到消息。完成!