先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面。

#ifndef TCPCLIENT_H

#define TCPCLIENT_H

#include

#include

#include

#include

#include

#include

#include

#include

class TcpClient : public QDialog

{

Q_OBJECT

public:

TcpClient(QWidget *parent = 0,Qt::WindowFlags f=0);

~TcpClient();

private:

QListWidget *contentListWidget;

QLineEdit *sendLineEdit;

QPushButton *sendBtn;

QLabel *userNameLabel;

QLineEdit *userNameLineEdit;

QLabel *serverIPLabel;

QLineEdit *serverIPLineEdit;

QLabel *portLabel;

QLineEdit *portLineEdit;

QPushButton *enterBtn;

QGridLayout *mainLayout;

bool status;

int port;

QHostAddress *serverIP;

QString userName;

QTcpSocket *tcpSocket;

public slots:

void slotEnter();

void slotConnected();

void slotDisconnected();

void dataReceived();

void slotSend();

};

#endif // TCPCLIENT_H

有一个加入服务器的按钮,还有一个发送消息的按钮,在头文件,先定义两个函数。

#include "tcpclient.h"

#include

#include

TcpClient::TcpClient(QWidget *parent,Qt::WindowFlags f)

: QDialog(parent,f)

{

setWindowTitle(tr("TCP Client"));

contentListWidget = new QListWidget;

sendLineEdit = new QLineEdit;

sendBtn = new QPushButton(tr("send"));

userNameLabel = new QLabel(tr("name"));

userNameLineEdit = new QLineEdit;

serverIPLabel = new QLabel(tr("server"));

serverIPLineEdit = new QLineEdit;

portLabel = new QLabel(tr("port"));

portLineEdit = new QLineEdit;

enterBtn= new QPushButton(tr("join chat"));

mainLayout = new QGridLayout(this);

mainLayout->addWidget(contentListWidget,0,0,1,2);

mainLayout->addWidget(sendLineEdit,1,0);

mainLayout->addWidget(sendBtn,1,1);

mainLayout->addWidget(userNameLabel,2,0);

mainLayout->addWidget(userNameLineEdit,2,1);

mainLayout->addWidget(serverIPLabel,3,0);

mainLayout->addWidget(serverIPLineEdit,3,1);

mainLayout->addWidget(portLabel,4,0);

mainLayout->addWidget(portLineEdit,4,1);

mainLayout->addWidget(enterBtn,5,0,1,2);

status = false;

port = 8010;

portLineEdit->setText(QString::number(port));

serverIP =new QHostAddress();

connect(enterBtn,SIGNAL(clicked()),this,SLOT(slotEnter()));

connect(sendBtn,SIGNAL(clicked()),this,SLOT(slotSend()));

sendBtn->setEnabled(false);

}

TcpClient::~TcpClient()

{

}

void TcpClient::slotEnter()

{

if(!status)

{

QString ip = serverIPLineEdit->text();

if(!serverIP->setAddress(ip))

{

QMessageBox::information(this,tr("error"),tr("server ip address error!"));

return;

}

if(userNameLineEdit->text()=="")

{

QMessageBox::information(this,tr("error"),tr("User name error!"));

return;

}

userName=userNameLineEdit->text();

tcpSocket = new QTcpSocket(this);

connect(tcpSocket,SIGNAL(connected()),this,SLOT(slotConnected()));

connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));

connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));

tcpSocket->connectToHost(*serverIP,port);

status=true;

}

else

{

int length=0;

QString msg=userName+tr(":Leave Chat Room");

if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg. length())

{

return;

}

tcpSocket->disconnectFromHost();

status=false;

}

}

void TcpClient::slotConnected()

{

sendBtn->setEnabled(true);

enterBtn->setText(tr("离开"));

int length=0;

QString msg=userName+tr(":Enter Chat Room");

if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length())

{

return;

}

}

void TcpClient::slotSend()

{

if(sendLineEdit->text()=="")

{

return ;

}

QString msg=userName+":"+sendLineEdit->text();

tcpSocket->write(msg.toLatin1(),msg.length());

sendLineEdit->clear();

}

void TcpClient::slotDisconnected()

{

sendBtn->setEnabled(false);

enterBtn->setText(tr("join chat"));

}

void TcpClient::dataReceived()

{

while(tcpSocket->bytesAvailable()>0)

{

QByteArray datagram;

datagram.resize(tcpSocket->bytesAvailable());

tcpSocket->read(datagram.data(),datagram.size());

QString msg=datagram.data();

contentListWidget->addItem(msg.left(datagram.size()));

}

}

实现界面布局。在Enter槽函数中,确定加入还是离开的服务器的功能。如果加入了,就将消息,写到tcpsocket中,构造消。

服务端的头文件:

#ifndef TCPSERVER_H

#define TCPSERVER_H

#include

#include

#include

#include

#include

#include

#include "server.h"

class TcpServer : public QDialog

{

Q_OBJECT

public:

TcpServer(QWidget *parent = 0,Qt::WindowFlags f=0);

~TcpServer();

private:

QListWidget *ContentListWidget;

QLabel *PortLabel;

QLineEdit *PortLineEdit;

QPushButton *CreateBtn;

QGridLayout *mainLayout;

int port;

Server *server;

public slots:

void slotCreateServer();

void updateServer(QString,int);

};

#endif // TCPSERVER_H

这是服务端的界面的,把消息显示而已。实现这个布局。

#include "tcpserver.h"

TcpServer::TcpServer(QWidget *parent,Qt::WindowFlags f)

: QDialog(parent,f)

{

setWindowTitle(tr("TCP Server"));

ContentListWidget = new QListWidget;

PortLabel = new QLabel(tr(" port"));

PortLineEdit = new QLineEdit;

CreateBtn = new QPushButton(tr("create chat"));

mainLayout = new QGridLayout(this);

mainLayout->addWidget(ContentListWidget,0,0,1,2);

mainLayout->addWidget(PortLabel,1,0);

mainLayout->addWidget(PortLineEdit,1,1);

mainLayout->addWidget(CreateBtn,2,0,1,2);

port=8010;

PortLineEdit->setText(QString::number(port));

connect(CreateBtn,SIGNAL(clicked()),this,SLOT(slotCreateServer()));

}

TcpServer::~TcpServer()

{

}

void TcpServer::slotCreateServer()

{

server = new Server(this,port);

connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int)));

CreateBtn->setEnabled(false);

}

void TcpServer::updateServer(QString msg,int length)

{

ContentListWidget->addItem(msg.left(length));

}

创建TCP的套接字,以便实现服务端和客户端的通信。

#ifndef TCPCLIENTSOCKET_H

#define TCPCLIENTSOCKET_H

#include

#include

class TcpClientSocket : public QTcpSocket

{

Q_OBJECT

public:

TcpClientSocket();

signals:

void updateClients(QString,int);

void disconnected(int);

protected slots:

void dataReceived();

void slotDisconnected();

};

#endif // TCPCLIENTSOCKET_H

以上是头文件,具体的是:

#include "tcpclientsocket.h"

TcpClientSocket::TcpClientSocket()

{

connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived()));

connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));

}

void TcpClientSocket::dataReceived()

{

while(bytesAvailable()>0)

{

int length = bytesAvailable();

char buf[1024];

read(buf,length);

QString msg=buf;

emit updateClients(msg,length);

}

}

void TcpClientSocket::slotDisconnected()

{

emit disconnected(this->socketDescriptor());

}

实现服务器,头文件:

#ifndef SERVER_H

#define SERVER_H

#include

#include

#include "tcpclientsocket.h"

class Server : public QTcpServer

{

Q_OBJECT

public:

Server(QObject *parent=0,int port=0);

QList tcpClientSocketList;

signals:

void updateServer(QString,int);

public slots:

void updateClients(QString,int);

void slotDisconnected(int);

protected:

void incomingConnection(int socketDescriptor);

};

#endif // SERVER_H

#include "server.h"

Server::Server(QObject *parent,int port)

:QTcpServer(parent)

{

listen(QHostAddress::Any,port);

}

void Server::incomingConnection(int socketDescriptor)

{

TcpClientSocket *tcpClientSocket = new TcpClientSocket;

connect(tcpClientSocket,SIGNAL(updateClients(QString,int)),this,SLOT(updateClients(QString,int)));

connect(tcpClientSocket,SIGNAL(disconnected(int)),this,SLOT(slotDisconnected(int)));

tcpClientSocket->setSocketDescriptor(socketDescriptor);

tcpClientSocketList.append(tcpClientSocket);

}

void Server::updateClients(QString msg,int length)

{

emit updateServer(msg,length);

for(int i=0;i

{

QTcpSocket *item = tcpClientSocketList.at(i);

if(item->write(msg.toLatin1(),length)!=length)

{

continue;

}

}

}

void Server::slotDisconnected(int descriptor)

{

for(int i=0;i

{

QTcpSocket *item = tcpClientSocketList.at(i);

if(item->socketDescriptor()==descriptor)

{

tcpClientSocketList.removeAt(i);

return;

}

}

return;

}

实现后的界面:

以上这篇QT网络编程Tcp下C/S架构的即时通信实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例相关推荐

  1. GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(一)

    环境 源端是一个RAC rac1 rac2: RHEL 4u7 + ORACLE 10.2.0.4 + ASM rac1 外网IP 192.168.47.241 虚拟IP 192.168.47.243 ...

  2. qt android安装在哪,Qt On Android开发环境安装、配置

    本文记录在Windows 8.1下,Qt on Android 5.5开发环境的安装和配置. 1.安装JDK 到甲骨文网站下载JDK:http://www.oracle.com 下载安装成功后,设置环 ...

  3. qt android图片自适应大小,Qt on Android:怎样适应不同的屏幕尺寸

    使用 Qt 开发的 Android 应用,怎样适应 Android 智能手机各种各样的屏幕尺寸? 说到屏幕尺寸,从 2.8 吋到 8.9 吋的手机屏幕都有,这对程序猿们来讲痛苦可不只一点. Andro ...

  4. qt android播放器代码,Qt on android 播放视频的实现

    本文介绍的是使用QML进行视频的播放,可以直接编译为APK在android上运行. QML中对多媒体的处理提供了很多方便的组件,对于播放音频.视频都很方便.这些多媒体组件属于Qt Multimedia ...

  5. qt android屏幕锁屏,Qt 实现超时锁屏

    最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口. 一.效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 二.实现思路 首先开启一个线程用于 ...

  6. qt android opengl,案例:实现Qt和OpenGL混合渲染 | 求索阁

    Qt自有一个绘图的引擎,这个引擎的核心就是QPainter,我们知道QPainter在渲染二维图形和文字有很大的优势,而OpenGL是当前流行的三维渲染器,怎样才能将两者结合起来,制作更为丰富的应用程 ...

  7. qt android文件读写文件,qt android 开发之写入xml配置文件篇

    应用初始化本地数据,需要读取配置文件,小编介绍如何通过xml简单写入配置文件,至于为什么选择这个格式,主要因为在qml中有一个很好 的类使用:XmlListModel xmlListModel能直接读 ...

  8. qt android漂亮控件,qt android 开发之炫酷控件的制做

    手机应用开发,就是吸引用户,要吸引用户,确定离不开用户体验!此次给你们分享一个自做的炫酷qml控件:fanControler 这个控件目前有点bug,不过整体效果仍是很赞的,经过滑动划片来控制风扇的转 ...

  9. 《BIO、NIO、AIO非阻塞通信实例》

    <BIO.NIO.AIO非阻塞通信实例> NIO与阻塞式通信区别 NIO通信IO工作方式原理 AIO通信编程 AIO服务端创建过程 AIO客户端创建过程 NIO通信编程 Reactor模型 ...

最新文章

  1. android oppo 权限,OPPO Reno可尝鲜Android Q:教程如下
  2. [FLASH_AS]Flash as3 addEventListener事件监听传递参数
  3. Hadoop1.1.2 Eclipse 插件编译
  4. 拦截游戏窗口被移动_Ruined King官网版-拳头rpg Ruined King游戏最新版下载v1.0
  5. WordPress一个还不错的404html单页代码
  6. hadoop安装笔记-cdh4
  7. 机器学习中各科目基本概念集合
  8. According to the overall view of the patent
  9. 阿里云服务器Ubuntu16.04安装Anaconda(python3.6)和本地远程连接jupyter
  10. 4.7 ResNet CNN、tensorflow实现——python实战
  11. 【IT历史】SP和CP
  12. 哈尔·埃尔罗德《早起的奇迹》读书笔记
  13. 用阿里网盘有一段时间了,说说总体感受吧
  14. Python | 查看微信撤回的消息(完整代码)
  15. 2022美国小非农ADP数据发布时间一览表
  16. vant-ui的官方入口
  17. 一个家庭幸不幸福,80%以上取决于女主人。有一种女人嫁给谁都幸福
  18. GC(Gabage Collection)
  19. 关于网页版伪春菜橘花shell的加载方法研究
  20. dockerfile构建mysql镜像并初始化数据库

热门文章

  1. 幼儿园小班上计算机课 作业内容是手口一致,小班幼儿手口不能一致的点数怎么办...
  2. OpenShift 4 - 使用ArgoCD Operator
  3. 如何高效的将 DataReader 转成 List<T> ?
  4. (一)为什么要在时间序列数据上使用AI?
  5. 使用C#将DataTable导出到文件
  6. Google TakeOut图片下载器
  7. LookAheadEnumerator:在解析器中实现回溯
  8. centos普通用户修改文件权限_Linux CentOS更改文件的权限与用户及用户组管理命令...
  9. java office web apps_应用程序与 Office Web Apps 整合
  10. nginx nodejs环境配置_nodejs + nginx + ECS阿里云服务器环境设置