Qt 實現TCP傳輸多人網絡聊天室帶界面

客戶發送端

頭文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    QTcpSocket* tcpSocket;
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    char id[256];
private slots:
    void on_send_clicked();
    void connect_success();
    void read();

    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

源文件

#include <QtGui/QApplication>
#include <QTextCodec>
#include "widget.h"

int main(int argc, char *argv[])
{

    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    // 告訴Qt本地系統字符編碼
    QTextCodec::setCodecForLocale(codec);
    // 告訴Qt程序中所使用的字符串的字符編碼
    QTextCodec::setCodecForCStrings(codec);
    // 告訴Qt外部的字符編譯
    QTextCodec::setCodecForTr(codec);

    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    //id[32]={};
    ui->setupUi(this);
    tcpSocket = new QTcpSocket;
    connect(tcpSocket,SIGNAL(connected()),this,SLOT(connect_success()));
    tcpSocket->connectToHost("10.0.2.15",8888);
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(read()));
}

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

void Widget::on_send_clicked()
{
    char buf[256] = {};
    //buf = ui->lineEdit->text().toStdString().c_str();
    sprintf(buf,"%s %s",id,ui->lineEdit->text().toStdString().c_str());
    int ret = tcpSocket->write(buf,strlen(buf)+1);
    //qDebug("send:%d",ret);
    //qDebug("%s %d",buff,i);
}
void Widget::read()
{
    char buff[256]={};
    int i = tcpSocket->read(buff,sizeof(buff));
    ui->textEdit->append(buff);
}
void Widget::connect_success()
{
    ui->send->setEnabled(true);
}

void Widget::on_pushButton_clicked()
{
    sprintf(id,"%s",ui->lineEdit_2->text().toStdString().c_str());
}

在這裏插入圖片描述
輸入端界面

服務後臺端

頭文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <vector>

using namespace std;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    QTcpServer* tcp;
    vector<QTcpSocket*> arrvertor;
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
public slots:
    void new_connect();
    void read_data();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

源文件

#include <QtGui/QApplication>
#include <QTextCodec>
#include "widget.h"

int main(int argc, char *argv[])
{
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    // 告訴Qt本地系統字符編碼
    QTextCodec::setCodecForLocale(codec);
    // 告訴Qt程序中所使用的字符串的字符編碼
    QTextCodec::setCodecForCStrings(codec);
    // 告訴Qt外部的字符編譯
    QTextCodec::setCodecForTr(codec);

    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcp = new QTcpServer;
    tcp->listen(QHostAddress("10.0.2.15"),8888);
    connect(tcp,SIGNAL(newConnection()),this,SLOT(new_connect()));
}

Widget::~Widget()
{
    delete ui;
}
void Widget::new_connect()
{
    QTcpSocket* tcpsoc = tcp->nextPendingConnection();
    connect(tcpsoc,SIGNAL(readyRead()),this,SLOT(read_data()));
    arrvertor.push_back(tcpsoc);
}
void Widget::read_data()
{
    for(int i=0;i<arrvertor.size();i++)
    {
        if(arrvertor[i]->bytesAvailable())
        {
            char buf[256] = {};
            arrvertor[i]->read(buf,sizeof(buf));
            //qDebug("%s",buf);
            ui->textEdit->append(buf);
            for(int j=0;j<arrvertor.size();j++)
            {
                arrvertor[j]->write(buf,strlen(buf)+1);
            }
            //qDebug("%s",buf);
        }
    }
}

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