服务器源代码如下:
项目文件 QuesTcpServer.pro
#------------------------------------------------- # # Project created by QtCreator 2019-07-24T08:28:28 # #------------------------------------------------- QT += core gui QT += network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = QuesTcpServer TEMPLATE = app SOURCES += main.cpp\ questcpserver.cpp \ server.cpp \ tcpclientsocket.cpp HEADERS += questcpserver.h \ server.h \ tcpclientsocket.h头文件 questcpserver.h
#ifndef QUESTCPSERVER_H #define QUESTCPSERVER_H #include <QDialog> #include <QListWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QGridLayout> #include "server.h" class QuesTcpServer : public QDialog { Q_OBJECT public: QuesTcpServer(QWidget *parent = 0); ~QuesTcpServer(); private: QListWidget *ContenListWidget; QLabel *PortLabel; QLineEdit *PortLineEdit; QGridLayout *mainLayout; int port; Server *server; public slots: void slotCreateServer(); void updateServer(QString,int); }; #endif // QUESTCPSERVER_H头文件 server.h
#ifndef SERVER_H #define SERVER_H #include <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头文件 tcpclientsocket.h
#ifndef TCPCLIENTSOCKET_H #define TCPCLIENTSOCKET_H #include <QTcpSocket> #include <QObject> class TcpClientSocket : public QTcpSocket { Q_OBJECT public: TcpClientSocket(QObject *parent = 0); private: QTcpSocket *tcpSocket; signals: void updateClients(QString,int); void disconnected(int); protected slots: void dataReceived(); void slotDisconnected(); }; #endif // TCPCLIENTSOCKET_H源文件 main.cpp
#include "questcpserver.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); QuesTcpServer w; w.show(); return a.exec(); }源文件 questcpserver.cpp
#include "questcpserver.h" #include <QHostInfo> QuesTcpServer::QuesTcpServer(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("服务器")); resize(500,300); ContenListWidget = new QListWidget; PortLabel = new QLabel(tr("端口:")); PortLineEdit = new QLineEdit; mainLayout = new QGridLayout(this); mainLayout->addWidget(ContenListWidget,0,0,1,2); port = 8010; PortLineEdit->setText(QString::number(port)); server = new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int))); } QuesTcpServer::~QuesTcpServer() { } void QuesTcpServer::slotCreateServer() { server = new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int))); } void QuesTcpServer::updateServer(QString msg,int length) { ContenListWidget->addItem(msg.left(length)); }源文件 server.cpp
#include "server.h" Server::Server(QObject *parent, int port) : QTcpServer(parent) { listen(QHostAddress::Any,port); } void Server::incomingConnection(int socketDescriptor) { TcpClientSocket *tcpClientSocket = new TcpClientSocket(this); 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++) { QByteArray msg = tr("提交成功!").toLocal8Bit(); QTcpSocket *item = TcpClientSocketList.at(i); if(item->write(msg)) { 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; }源文件 tcpclientsocket.cpp
#include "tcpclientsocket.h" TcpClientSocket::TcpClientSocket(QObject *parent) { 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; //QString msg = QString::fromLocal8Bit(buf); emit updateClients(msg,length); } } void TcpClientSocket::slotDisconnected() { emit disconnected(this->socketDescriptor()); }其中,有些许问题所在,当用户名填入中文后提交,服务器会显示乱码。试图做修改,服务器第一次接收并正确显示出信息,但第二次提交后便有乱码存在。多次尝试后,未找到问题所在,留作以后对Qt学习更深入后再解决。代码部分已将其注释掉了。
参考网站:https://blog.csdn.net/u014695839/article/details/70041771点击打开链接
http://mobile.51cto.com/symbian-270781_1.htm点击打开链接
