Qt網絡編程—TCP/IP(一)

軟件環境: 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;

}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章