Qt creator5.14.2+Netty开发聊天软件,C++客户端,Java服务端,TCP通信

Qt creator5.14.2+Netty开发聊天软件,C++客户端,Java服务端,TCP通信,第1张

Qt5.14.2开发平台可以开发桌面应用,适配Linux,windows,Mac,使用C++编写,学习一下,用个demo练手,服务端是用Java编写Netty框架,客户端使用Qt开发。

Netty的pom引用:

 
        
            io.netty
            netty-all
            4.1.77.Final
        

Java服务端代码:

package com.my.chatroom;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class ChatServer {
    public static void main(String[] args) {
        ChatServer server=new ChatServer(9996);
        server.run();
    }
    private int port;

    public ChatServer(int port) {
        this.port = port;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public void run() {
        EventLoopGroup bossGroup=new NioEventLoopGroup();
        EventLoopGroup workerGroup=new NioEventLoopGroup();
        ServerBootstrap serverBootstrap=new ServerBootstrap();
        try {
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG,128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    .childHandler(new ChannelInitializer() {

                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline=ch.pipeline();
                            /*
                             * 网络数据都是二进制数据,但是业务数据一般都不是二进制数据,
                             * 这时就需要将业务数据转换为二进制,接收的二进制再转换为业务需要的数据
                             * 业务端String进入网络,成为二进制数据,StringDecoder将二进制转换为字符串
                             * 业务处理后,StringEncoder将字符串转换为二进制传输出去
                             */
                            //往pipeline链中添加解码器
                            pipeline.addLast("decoder",new StringDecoder());
                            //往pipeline链中添加编码器
                            pipeline.addLast("encoder",new StringEncoder());
                            //将业务将入pipeline链,解码器和编码器一定要在业务类之前。
                            pipeline.addLast(new ChatServerHandler());
                        }

                    });
            System.out.println("服务器端已就绪");
            ChannelFuture future=serverBootstrap.bind(port);
            future.sync();
            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }
}

Java客户端代码:

package com.my.chatroom;

import java.util.Scanner;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class ChatClient {
    public static void main(String[] args) {
        ChatClient client=new ChatClient("127.0.0.1", 9996);
        client.run();
    }
    private String IP;
    private int port;
    public String getIP() {
        return IP;
    }
    public void setIP(String iP) {
        IP = iP;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public ChatClient(String iP, int port) {
        IP = iP;
        this.port = port;
    }
    public void run() {
        EventLoopGroup group=new NioEventLoopGroup();
        try {
            Bootstrap bootstrap=new Bootstrap();
            bootstrap.group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer() {

                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline=ch.pipeline();
                            //解码
                            pipeline.addLast("decoder",new StringDecoder());
                            //编码
                            pipeline.addLast("encoder",new StringEncoder());
                            //业务处理类
                            pipeline.addLast(new ChatClientHandler());
                        }

                    });
            ChannelFuture future=bootstrap.connect(IP, port);
            future.sync();
            Channel channel=future.channel();
            Scanner scanner=new Scanner(System.in);
            while(scanner.hasNext()) {
                String text=scanner.nextLine();
                channel.writeAndFlush(text+"\n\r");
            }
            channel.closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            group.shutdownGracefully();
        }
    }
}

Qt 平台C++代码:MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include 
#include 
#include 
#include 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

        m_tcp = new QTcpSocket;
        m_tcp->connectToHost(QHostAddress("10.60.1.117"),9996);
        setWindowTitle("OO");
        ui->setupUi(this);
        connect(m_tcp,&QTcpSocket::readyRead,this,[=]()
        {
            QByteArray data = m_tcp->readAll();
            ui->record->appendPlainText("服务器说:"+data);
        });
}

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


void MainWindow::on_pushButton_clicked()
{
    QString s = ui->msg->toPlainText();

    qDebug()<<"str=="<record->appendPlainText("客户端说:"+s);
    m_tcp->write(s.toUtf8());
    ui->msg->clear();

}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
private:
    QErrorMessage *error;
    QTcpSocket *m_tcp;
    QLabel *m_status;
};


#endif // MAINWINDOW_H

C++工程的 .pro文件,必须加入QT += network,才能使用TCP通信模块

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
QT += network

main.cpp

#include "mainwindow.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

ui各位随意,本人画的比较朴素,哈哈!

C++本项目源码免费下载:

基于QtCreator5.12.4C++客户端-C++文档类资源-CSDN下载

 带图标版,打包后带有图标:

Qtcreator5.9.9聊天客户端软件,带图标-C++文档类资源-CSDN下载

下面看看运行效果:

首先运行Java的Netty服务端,后运行Qt桌面应用客户端

 查看服务端输出

 启动Java的Netty客户端

 Qt 客户端发送消息:

 查看Netty服务端和客户端消息输出

 Java客户端输入发送:

 Qt 客户端接收消息并显示:

 Java的Netty服务端日志:

打包部署的时候要注意工程编译时使用的编译器要和打包编译器要对应,不然会出问题。

带图标的exe生成后:海绵宝宝的ico

 发个表情,竟然是黑白的,哈哈,待优化

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1498195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

随机推荐

  • 一人曲是哪个国家的品牌?

    【导读】:一人曲SENIN一人曲,20年线下健身器材领导品牌,全国2678家专柜同步上市,数年来一直专注居家健身器材开发,在全球最先提倡以健身最求美感.提升内在自...一人曲是中国品牌。一人曲SENI

    2022-08-19
    0 0 0
  • pabojoe是哪个国家的品牌?

    【导读】:Pabojoe,一个源自的英国品牌,中文名:派保爵。上海梁信国际贸易有限公司旗下品牌,拥有近万款箱包品种及数量,产品线涉及时尚、商务、休闲、户外运动...pabojoe是中国品牌。Paboj

    2022-08-19
    0 0 0
  • 肽诱人是哪个国家的品牌?

    【导读】:肽诱人肽诱人品牌隶属于北京康比特体育科技股份有限公司,康比特是英文竞技者competitor的汉译,表明康比特聚焦于运动产业的经营理念,企业通过专业 的...肽诱人是中国品牌。肽诱人肽诱人品

  • 普芝堂是哪个国家的品牌?

    【导读】:普芝堂普芝堂品牌隶属于安徽一品堂生物科技有限公司,公司是集灵芝石斛产品种植、生产、销售服务于一体的新型生物农业企业,公司坚持以“绿色、科技、...普芝堂是中国品牌。普芝堂普芝堂品牌隶属于安徽

    2022-08-19
    0 0 0
  • flykace是哪个国家的品牌?

    【导读】:flykaceflykace品牌隶属于杭州韩歌音响器械有限公司,公司成立于2012年5月,一直从事于IP功放、IP音柱、IP广播系统、校园广播系统、定时播放器定压功放...flykace是中

    2022-08-19
    0 0 0
  • 路拉迪是哪个国家的品牌?

    【导读】:路拉迪路拉迪品牌隶属于福州佐肯鞋业有限公司,成立于2013年,是一家电子商务公司,主营鞋类产品涉及的业务还有代运营。现有天猫店3家,京东商城3家。...路拉迪是中国品牌。路拉迪路拉迪品牌隶属

    2022-08-19
    0 0 0
  • 赛多是哪个国家的品牌?

    【导读】:赛多SOTO北京赛多公司(SOTO CORP.)是一个生产医用、商用和民用空气(消毒)净化器的企业。SOTO-AE系列空气(消毒)净化器从结构、性能和工艺上均能达到...赛多是中国品牌。赛多

    2022-08-19
    0 0 0
  • 爱乐贝兜儿是哪个国家的品牌?

    【导读】:爱乐贝兜儿爱乐贝兜儿品牌成立于2010年,隶属于青岛圣梵帝斯服装服饰有限公司。自品牌创立以来,爱乐贝兜儿一直致力于研究时尚潮流童装,专为3-12岁男童...爱乐贝兜儿是中国品牌。爱乐贝兜儿爱

    2022-08-19
    0 0 0
  • 和平是哪个国家的品牌?

    【导读】:和平铜陵市和平姜业有限责任公司,是一家生姜系列产品加工的民营企业,也是铜陵地区起步较早、规模较大、效益较好的生姜加工企业,基地年产优质铜陵白...和平是中国品牌。和平铜陵市和平姜业有限责任公

    2022-08-19
    0 0 0

发表评论

登录后才能评论

评论列表(0条)

保存