大佬教程收集整理的这篇文章主要介绍了QT网络编程Tcp下C/S架构的即时通信实例,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面。
#ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #include <QListWidget> #include <QlineEdit> #include <QPushbutton> #include <QLabel> #include <qgridLayout> #include <QtNetWork/QHostAddress> #include <QtNetWork/QTcpsocket> 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 <QmessageBox> #include <QHosTinfo> 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,1,2); mainLayout->addWidget(sendlineEdit,0); mainLayout->addWidget(sendBtn,1); mainLayout->addWidget(usernameLabel,2,0); mainLayout->addWidget(usernamelineEdit,1); mainLayout->addWidget(serverIPLabel,3,0); mainLayout->addWidget(serverIPlineEdit,1); mainLayout->addWidget(portLabel,4,0); mainLayout->addWidget(portlineEdit,1); mainLayout->addWidget(enterBtn,5,2); status = false; port = 8010; portlineEdit->setText(QString::number(port)); serverIP =new QHostAddress(); connect(enterBtn,SIGNAL(clicked()),this,SLOT(slotEnter())); connect(sendBtn,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("User name error!")); return; } username=usernamelineEdit->text(); tcpsocket = new QTcpsocket(this); connect(tcpsocket,SIGNAL(connected()),SLOT(slotConnected())); connect(tcpsocket,SIGNAL(disconnected()),SLOT(slotdisconnected())); connect(tcpsocket,SIGNAL(readyRead()),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 <QDialog> #include <QListWidget> #include <QLabel> #include <QlineEdit> #include <QPushbutton> #include <qgridLayout> #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,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,2); mainLayout->addWidget(PortLabel,0); mainLayout->addWidget(PortlineEdit,1); mainLayout->addWidget(CreateBtn,2); port=8010; PortlineEdit->setText(QString::number(port)); connect(CreateBtn,SLOT(slotCreateServer())); } Tcpserver::~Tcpserver() { } voID Tcpserver::slotCreateServer() { server = new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)),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 <QtNetWork/QTcpsocket> #include <QObject> 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,SLOT(dataReceived())); connect(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 <QtNetWork/QTcpserver> #include <QObject> #include "tcpclIEntsocket.h" class Server : public QTcpserver { Q_OBjeCT public: Server(QObject *parent=0,int port=0); QList<TcpClIEntSocket*> 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,SLOT(updateClIEnts(QString,int))); connect(tcpClIEntSocket,SIGNAL(disconnected(int)),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<tcpClIEntSocketList.count();i++) { QTcpsocket *item = tcpClIEntSocketList.at(i); if(item->write(msg.tolaTin1(),length)!=length) { conTinue; } } } voID Server::slotdisconnected(int descriptor) { for(int i=0;i<tcpClIEntSocketList.count();i++) { QTcpsocket *item = tcpClIEntSocketList.at(i); if(item->socketDescriptor()==descriptor) { tcpClIEntSocketList.removeAt(i); return; } } return; }
实现后的界面:
以上这篇QT网络编程Tcp下C/S架构的即时通信实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。
以上是大佬教程为你收集整理的QT网络编程Tcp下C/S架构的即时通信实例全部内容,希望文章能够帮你解决QT网络编程Tcp下C/S架构的即时通信实例所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。