(1)篇里面代码没完全贴出,有些同学说没看明白。今天又闲的蛋疼,无聊弄个服务端跟客户端整在一个程序上的例子。

 

代码跟一篇有点相同,但是又有点不同。先贴出效果图。。。

 

 

为了效果明显,我一个在linux 下,一个在xp下运行。

 

代码如下:

头文件

#ifndef NETWORKTCP_H
#define NETWORKTCP_H

#include <QMainWindow>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <map>
#include <iostream>
#include <QMessageBox>
using namespace std;

namespace Ui {
    class NetworkTcp;
}

class NetworkTcp : public QMainWindow
{
    Q_OBJECT

public:
    explicit NetworkTcp(QWidget *parent = 0);
    ~NetworkTcp();

    QTcpServer *m_pTcpServer;
    QTcpSocket *m_pTcpSocket;
    map<int,QTcpSocket*> map_TcpSocket;

      QTcpSocket *pTcpSocketServer;
      QTcpSocket *pTcpSocketClient;

    bool isServer;
private:
    Ui::NetworkTcp *ui;

private slots:
    void slotStartServer();
    void slotConnectServer();
    void slotSendMesg();
    void slotNewConnect();
    void slotReadMesg();
};

#endif // NETWORKTCP_H


源文件

 

#include "NetworkTcp.h"
#include "ui_networktcp.h"

NetworkTcp::NetworkTcp(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::NetworkTcp)
{
    ui->setupUi(this);
    isServer= true;     //默认服务端
    this->connect(ui->pushButton_StartServer,SIGNAL(clicked()),this,SLOT(slotStartServer()));
    this->connect(ui->pushButton_ConnectServer,SIGNAL(clicked()),this,SLOT(slotConnectServer()));
    this->connect(ui->pushButton_Send,SIGNAL(clicked()),this,SLOT(slotSendMesg()));
}

NetworkTcp::~NetworkTcp()
{
    delete ui;
}


void NetworkTcp::slotStartServer()  //启动服务器
{
    isServer = true;
    ui->pushButton_ConnectServer->setEnabled(false);
    ui->lineEdit_IP->setEnabled(false);
    ui->lineEdit_NetPort->setEnabled(false);
    m_pTcpServer = new QTcpServer();
    m_pTcpServer->listen(QHostAddress::Any,19999);
    this->connect(m_pTcpServer,SIGNAL(newConnection()),this,SLOT(slotNewConnect()));
}

void NetworkTcp::slotNewConnect()
{
//    QTcpSocket *pTcpSocket;
    pTcpSocketServer =  m_pTcpServer->nextPendingConnection();
//    pTcpSocketTemp = pTcpSocket;
//    int sockfd = pTcpSocketTemp->socketDescriptor();
//    map_TcpSocket.insert(make_pair(sockfd,pTcpSocket));
    this->connect(pTcpSocketServer,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));
}

void NetworkTcp::slotReadMesg() //读取信息
{
//    int sockfd = pTcpSocketTemp->socketDescriptor();
    if(isServer == true)
    {
        QByteArray qba= pTcpSocketServer->readAll(); //读取

        QString ss=QVariant(qba).toString();
        QHostAddress ip = pTcpSocketServer->peerAddress();
        QString qStrSendInfo = ip.toString()+" : "+ss;
        ui->textEdit_Info->append(qStrSendInfo);

    }
    else if(isServer == false)
    {
        QByteArray qba= pTcpSocketClient->readAll(); //读取
        QString ss=QVariant(qba).toString();
        QHostAddress ip = pTcpSocketClient->peerAddress();
        QString qStrSendInfo = ip.toString()+" : "+ss;
        ui->textEdit_Info->append(qStrSendInfo);

    }
}

void NetworkTcp::slotConnectServer()    //连接服务器
{
    if(ui->lineEdit_IP->text().isEmpty() ||ui->lineEdit_NetPort->text().isEmpty())
    {
        QMessageBox::warning(this,tr("Warning"),tr("Please input IP OR NetPort!"));
        return;
    }

    isServer = false;
    ui->pushButton_StartServer->setEnabled(false);
    pTcpSocketClient = new QTcpSocket(this);
    pTcpSocketClient->abort();
    QString qStrIP = ui->lineEdit_IP->text();
    quint16 netport = ui->lineEdit_NetPort->text().toInt();
    pTcpSocketClient->connectToHost(qStrIP,netport);

    connect(pTcpSocketClient,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));

}

void NetworkTcp::slotSendMesg() //发送消息
{
    QString strMesg= ui->lineEdit_sendmsg->text();
    ui->lineEdit_sendmsg->clear();
    if(isServer == true)
    {

         pTcpSocketServer->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));
    }

    else if(isServer == false)
    {
         pTcpSocketClient->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));
    }

}


 

我一直想知道QQ发信息是怎么弄的,到现在还是没想明白里面的流程。。。唉。。。

希望懂的人一起交流交流。。。

GitHub 加速计划 / li / linux-dash
11
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐