程序笔记   发布时间:2022-05-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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架构的即时通信实例全部内容,希望文章能够帮你解决QT网络编程Tcp下C/S架构的即时通信实例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。