Qt Socket(简单的通讯)

学习了Qt好长时间了,今天开始做聊天软件,在网上看了下被人做的,有点意思。不过它的功能有点简单,自己想扩展一下,主要增加的功能有;(下篇博客)

        1、实现客户端之间的私聊,以及群聊;

        2、传输文件;

        3、发送表情符号,类似QQ那种功能。

4、增加数据库的操作

5、实现用户注册、登陆的功能。

一下是程序的截图:


程序源代码:

client.h

#ifndef CLIENT_H
#define CLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>

class client : public QWidget
{
    Q_OBJECT
public:
    explicit client(QWidget *parent = 0);
    
signals:
private:
    QTextEdit *textEdit;
    QLineEdit *lineEdit;
    QPushButton *sendBtn;
    QPushButton *connectBtn;
    QTcpSocket *m_tcpsocket;
    QString userStr;
    
private slots:
    void connectTcpServer();
    void connectedServer();
    void readMessage();
    void sendMessage();
    
};

#endif // CLIENT_H

client.cpp

#include "client.h"
#include <QHBoxLayout>
#include <QHostAddress>

client::client(QWidget *parent) :
    QWidget(parent)
{
    userStr = QString(tr("张三"));
    textEdit = new QTextEdit;
    textEdit->setReadOnly(true);
    lineEdit = new QLineEdit;
    connectBtn = new QPushButton("连接服务器");
    connect(connectBtn,SIGNAL(clicked()),this,SLOT(connectTcpServer()));
    sendBtn = new QPushButton("发送");
    connect(sendBtn,SIGNAL(clicked()),this,SLOT(sendMessage()));
    QHBoxLayout *bottomlayout = new QHBoxLayout;
    bottomlayout->addWidget(connectBtn);
    bottomlayout->addWidget(sendBtn);
    QVBoxLayout *mainlayout = new QVBoxLayout;
    mainlayout->addWidget(textEdit);
    mainlayout->addWidget(lineEdit);
    mainlayout->addLayout(bottomlayout);
    setLayout(mainlayout);
}

void client::connectTcpServer()
{
    m_tcpsocket = new QTcpSocket(this);
    m_tcpsocket->abort();
    m_tcpsocket->connectToHost(QHostAddress::LocalHost,55555);
    connect(m_tcpsocket,SIGNAL(connected()),this,SLOT(connectedServer()));
    connect(m_tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
    textEdit->append(tr("连接服务器......")+'\n');
    connectBtn->setEnabled(false);
}

void client::connectedServer()
{
    textEdit->append(tr("连接服务器成功!")+'\n');
}

void client::readMessage()
{
    QString string;
    QByteArray block = m_tcpsocket->readAll();
    QDataStream in(block);
    in.setVersion(QDataStream::Qt_4_7);
    in>>string;
    textEdit->append(tr("用户有消息到来\n消息是:")+string+'\n');
}

void client::sendMessage()
{
    int type;
    type = 1;
    QString string = lineEdit->text();
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out<<userStr;
    out<<type;
    out<<string;
    m_tcpsocket->write(block);
    lineEdit->clear();
}

serverc.h

#ifndef SERVER_H
#define SERVER_H

#include <QWidget>
#include <QTcpSocket>
#include <QtNetwork>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>

class server : public QWidget
{
    Q_OBJECT
public:
    explicit server(QWidget *parent = 0);
    
signals:
private:
    QTextEdit *textEdit;
    QLineEdit *lineEdit;
    QPushButton *sendBtn;
    QPushButton *startBtn;
    QTcpSocket *m_tcpsocket;
    QTcpServer *m_tcpserver;
    
private slots:
    void startTcpServer();
    void sendMessage();
    void newConnect();
    void readMessage();
    
};

#endif // SERVER_H

server.cpp

#include "server.h"
#include <QHBoxLayout>

server::server(QWidget *parent) :
    QWidget(parent)
{
    textEdit = new QTextEdit;
    textEdit->setReadOnly(true);
    lineEdit = new QLineEdit;
    startBtn = new QPushButton("打开服务器");
    connect(startBtn,SIGNAL(clicked()),this,SLOT(startTcpServer()));
    sendBtn = new QPushButton("发送");
    connect(sendBtn,SIGNAL(clicked()),this,SLOT(sendMessage()));
    QHBoxLayout *bottomlayout = new QHBoxLayout;
    bottomlayout->addWidget(startBtn);
    bottomlayout->addWidget(sendBtn);
    QVBoxLayout *mainlayout = new QVBoxLayout;
    mainlayout->addWidget(textEdit);
    mainlayout->addWidget(lineEdit);
    mainlayout->addLayout(bottomlayout);
    setLayout(mainlayout);
}

void server::startTcpServer()
{
    startBtn->setEnabled(false);
    m_tcpserver = new QTcpServer;
    m_tcpserver->listen(QHostAddress::Any,55555);
    connect(m_tcpserver,SIGNAL(newConnection()),this,SLOT(newConnect()));
}

void server::sendMessage()
{
    QString string = lineEdit->text();
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out<<string;
    m_tcpsocket->write(block);
}

void server::newConnect()
{
    textEdit->append(tr("有用户链接...")+'\n');
    m_tcpsocket = m_tcpserver->nextPendingConnection();
    connect(m_tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
}

void server::readMessage()
{
    QString userstr;
    int type;
    QString string;
    QByteArray block = m_tcpsocket->readAll();
    QDataStream in(block);
    in.setVersion(QDataStream::Qt_4_7);
    in>>userstr;
    in>>type;
    in>>string;
    textEdit->append(userstr+tr("用户有消息到来\n消息是:")+string+'\n');
}

main.cpp

#include <QApplication>
#include "widget.h"
#include "server.h"
#include "client.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //Widget w;
    //w.show();

    //setcodec
    QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("system"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("system"));

    server s;
    s.show();
    client c1;
    c1.show();
    return a.exec();
}

自己要多加练习,争取实现以上所列举的功能!


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值