亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

QT網絡編程Tcp下C/S架構的即時通信實例

2020-01-26 13:57:11
字體:
來源:轉載
供稿:網友

先寫一個客戶端,實現簡單的,能加入聊天,以及加入服務器的界面。

#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,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 <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,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 <QtNetWork/QTcpSocket>#include <QObject> class TcpClientSocket : public QTcpSocket{ Q_OBJECTpublic: 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 <QtNetWork/QTcpServer>#include <QObject>#include "tcpclientsocket.h" class Server : public QTcpServer{ Q_OBJECTpublic: 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,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<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架構的即時通信實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线观看| 91精品视频在线看| 国产日韩在线精品av| 日韩高清欧美高清| 国产在线拍偷自揄拍精品| 97涩涩爰在线观看亚洲| 成人两性免费视频| 97精品在线视频| 亚洲天堂av在线免费| 成人精品aaaa网站| 在线观看欧美视频| 国产精品永久免费视频| 久久资源免费视频| 久久99亚洲精品| 亚洲欧美日韩在线高清直播| 自拍偷拍亚洲一区| 色综合久久中文字幕综合网小说| 久久香蕉国产线看观看网| 午夜精品久久久久久久99热浪潮| 欧美最猛黑人xxxx黑人猛叫黄| 中文字幕亚洲欧美日韩在线不卡| 色阁综合伊人av| 亚洲理论片在线观看| 伊人亚洲福利一区二区三区| 韩国精品久久久999| 国产成人精品久久亚洲高清不卡| 少妇高潮久久77777| 欧美激情精品久久久久久免费印度| 亚洲国产成人精品女人久久久| 国产亚洲精品一区二555| 国产有码在线一区二区视频| 亚洲丝袜av一区| 国产午夜精品一区二区三区| 欧美乱妇40p| 国产亚洲欧美日韩一区二区| 成人欧美在线观看| 一区二区三区视频观看| 久久97精品久久久久久久不卡| 亚洲乱码一区av黑人高潮| 俺去亚洲欧洲欧美日韩| 中文字幕亚洲国产| 欧美在线视频一二三| 538国产精品视频一区二区| 欧美国产亚洲精品久久久8v| 国产日韩欧美日韩| 在线观看国产精品淫| 色妞色视频一区二区三区四区| 久久久亚洲成人| 亚洲乱码国产乱码精品精| 国产精品第二页| 国模吧一区二区三区| 欧美精品久久久久| 欧美极品欧美精品欧美视频| 久久精品久久精品亚洲人| 久久久电影免费观看完整版| 欧美福利在线观看| 91精品免费久久久久久久久| 欧美二区在线播放| 国内精品久久久久久影视8| 国产一区二区三区高清在线观看| 精品国产一区二区三区四区在线观看| 亚洲第一男人天堂| 国产在线视频2019最新视频| 欧美激情视频一区二区| 97久久超碰福利国产精品…| 欧美日韩ab片| 亚洲tv在线观看| 狠狠色香婷婷久久亚洲精品| 国产成人综合久久| 精品国产一区二区三区久久狼5月| 欧美性受xxxx黑人猛交| 亚洲国产欧美一区二区丝袜黑人| 日韩中文理论片| 日韩在线精品一区| 亚洲xxx自由成熟| 欧美成人午夜激情| 91精品久久久久久久久不口人| 欧美高清视频免费观看| 91色视频在线观看| 亚洲国产成人av在线| 国产精品高潮呻吟久久av黑人| 国产综合在线观看视频| 久久人人爽人人爽人人片av高清| 这里只有精品在线观看| 日韩中文字幕网站| 亚洲精品xxx| 一本久久综合亚洲鲁鲁| 亚洲欧美精品suv| 亚洲精品第一国产综合精品| 国产精品天天狠天天看| 91产国在线观看动作片喷水| 亚洲激情第一页| 国内精品中文字幕| 2021久久精品国产99国产精品| 精品国产一区久久久| 国产亚洲一区精品| 欧美日韩视频在线| 国模私拍视频一区| 久久精彩免费视频| 亚洲国产天堂久久国产91| 91精品国产亚洲| 国产精彩精品视频| 欧美黄网免费在线观看| 91精品国产自产在线老师啪| 欧美精品18videos性欧| 日韩av网站大全| 一区二区三区亚洲| 亚洲成人亚洲激情| 欧美日韩中文字幕在线视频| 久久91精品国产91久久久| 亚洲人成电影网| 国产一区二区三区三区在线观看| 91黑丝高跟在线| 欧美老女人性生活| 97热在线精品视频在线观看| 亚洲欧美精品在线| 亚洲第一在线视频| 国产成人综合精品在线| 国产精品久久久久9999| 亚洲一区二区三区乱码aⅴ蜜桃女| 2021久久精品国产99国产精品| 欧美一级视频一区二区| 国产精品美女主播在线观看纯欲| 美女扒开尿口让男人操亚洲视频网站| 宅男66日本亚洲欧美视频| 日韩视频免费大全中文字幕| 欧美一级大片在线免费观看| 亚洲专区在线视频| 久久精品人人做人人爽| 久久网福利资源网站| 亚洲国模精品私拍| 亚洲福利视频久久| 日本三级久久久| 成人激情在线播放| 91在线观看免费观看| 亚洲精品一区二区久| 91麻豆国产语对白在线观看| 国产97人人超碰caoprom| 久久久久久久国产精品视频| 91青草视频久久| 91精品在线影院| 一本色道久久88综合亚洲精品ⅰ| 国产精品黄页免费高清在线观看| 操日韩av在线电影| 日韩精品一二三四区| 国产成人中文字幕| 国产精品中文在线| 国产91在线播放九色快色| 亚洲综合第一页| 欧美日韩国产精品| 亚洲va欧美va国产综合剧情| 秋霞午夜一区二区| 中文在线不卡视频| 日韩欧美精品中文字幕| 亚洲福利视频专区| 丁香五六月婷婷久久激情| 亚洲四色影视在线观看| 欧美在线观看日本一区| 日韩视频中文字幕| 日本精品久久久久影院| 国产成人拍精品视频午夜网站| 中文字幕v亚洲ⅴv天堂| 国产精品国产自产拍高清av水多| 亚洲a∨日韩av高清在线观看|