Qt之QTcpServer/QTcpSocket简单收发信息(2)

(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发信息是怎么弄的,到现在还是没想明白里面的流程。。。唉。。。

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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值