QT中的网络编程(网络聊天)

这里主要说的是TCP通信

服务器简略设计

客户端和客户端之间是不能直接交互的,这也是服务器存在的意义.

响应和接收信息时都是异步通信的方式,产生相应信号

创建服务器连接

使用QTcpServer(QT中创建TCP服务器的类)创建服务器

设置监听服务器ip地址和端口

响应客户端连接

获取客户端通信的TCP套接字

保存客户端通信套接字

实时接收客户端发送的消息

接收客户端发送的信息

检查客户端是否有消息

有消息则读取 保存 显示

将消息发给所有在线的客户端

客户端简略设计

创建通信套接字

使用QTcpSocket创建套接字

和服务器建立连接

通过配置服务器ip和端口想服务器发送请求

连接成功,发送进入聊天提示信息

发送,接收聊天信息

输入聊天信息,发送到服务器

实时接收服务器发送的信息,并显示

TCP协议简介

TCP(传输控制协议),是一个可靠的,基于字节流的,面向连接的传输层协议.

在OSI定义的七层网络模型中,TCP属于第四层传输层所指定的功能,

在TCP/IP协议族中,位于IP层之上,应用层之下的中间层.

主机应用层之间经常需要可靠的,像管道一样的连接,但IP层不提供这样的流机制.

TCP协议符合这一要求,特别适合连续传输数据,同时能保证数据的安全性.

HTTP协议就是基于TCP协议实现的.

QTcpServer类简介

提供了TCP服务器,可以快速的建立TCP服务器,平且可以实时的响应客户端的连接请求.

QTcpServer::listen()可以指定服务器端口号(端口号0-65535,但是0-1024一般是系统使用的),没有指定QTcpServer会自动选择一个可用的端口号,该函数还会监听当前主机指定的IP地址(QHostAddress)(服务器主机上可能有多块网卡,例如笔记本上可以通过有线,无线连接(就好像手机可以双卡双待一样,设置一个IP就相当于设置一个电话号)),通常设置成QHostAddress::Any(对应0.0.0.0)这个地址可以监听所有地址.

设置监听后,每当检测到客户端发来的连接请求,都会发送信号newConnection(),可以自定义槽函数,调用nextPandingConnection()获取和客户端通信的套接字.

QTcpServer,创建TCP服务器

创建QTcpServer对象

QTcpServer tcp_server;

开启TCP服务器,监听所有地址,端口号

tcp_server.listen(QHostAddress::Any,port);

客户端向服务器发送连接请求时,发送的信号处理槽函数

connect(&tcpserver,SLGNAL(newConnection()),this,SLOT(answerConnection()自定义槽函数));

void answerConnection()
{
    //获取和客户端通信的套接字
    QTcpServer* client_socket = tcp_server.nextPendingConnection();
    //保存客户端套接字
    client_list.append(client_socket);
    //客户端向服务器发送消息时,触发readyread信号
    connect(client_socket,SIGNAL,(readyread()),this,SLOT(answerReadyread()));
}

接收客户端发来的信息

void answerReadyread()
{
    //遍历检查哪个客户端有消息
    for(int i = 0;i < client_list.size();i++)
    {
        //获取等待套接字字节数,没有消息返回0
        if(client_list.at[i]->bytesAvailable())
        {
            QByteArray buf = client_list.at(i)->readALL();//读取保存到buf
            ui->listWidget->addItem(buf);//显示到界面
            sendMessage(buf);//发送给其他客户端
        }
    }
}

客户端基于QTcpSocket


                
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值