发布时间 : 星期二 文章基于TCP的网络聊天程序更新完毕开始阅读
基于TCP的网络聊天程序
问题概述:
网络聊天是网络应用中的一种常见的功能。TCP是一种可靠的、面向连接、面向数据流的传输协议,多数网络协议都使用TCP协议,包括HTTP和FTP,TCP协议非常适合数据的连续传输。 技术难点:
TCP通信协议;QTcpsocket的使用。 实践方案:
在linux_ubuntu下使用qt_eclipse编写c++程序。
由面向对象的思想,为了实现程序,在server终端部分有3个类: 1. serve 2. tcpclient 3. tcpserve
Serve类是继承自QTcpServer,实现TCP协议的服务器; Tcpclient继承自QTcpSocket,实现一个TCP套接字;
Tcpserve是一个QDialog,负责服务器终端的对话框显示与控制。 如下是对serve的实现代码: Server.h
#include
#include \class Server : public QTcpServer {Q_OBJECT public:
Server(QObject *parent = 0,int port=0); QList
voidupdateServer(QString,int); public slots:
voidupdateClients(QString,int); voidslotDisconnected(int); protected:
voidincomingConnection(intsocketDescriptor);};
____________________________________________________________________ Tcpclient.h
#include
#include
classTcpClientSocket : public QTcpSocket {Q_OBJECT public:
TcpClientSocket(QObject *parent=0);
~TcpClientSocket(); signals:
voidupdateClients(QString,int); void disconnected(int); protected slots: voiddataReceived();
voidslotDisconnected();};
__________________________________________________________________ Tcpserver.h
#include
#include
classTcpServer : public QWidget {Q_OBJECT public:
TcpServer(QWidget *parent=0, Qt::WindowFlags f=0 ); ~TcpServer(); public:
QListWidget *ListWidgetContent; QLabel* LabelPort;
QLineEdit* LineEditPort;
QPushButton* PushButtonCreate; int port;
Server *server; public :
voidslotCreateServer();
voidupdateServer(QString,int);};
________________________________________________________________
Server.cpp
#include
Server::Server(QObject *parent,int port): QTcpServer(parent){ listen(QHostAddress::Any,port);}
void Server::incomingConnection(intsocketDescriptor)
{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(QStringmsg,int length) {emitupdateServer(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; } Tcpclient.cpp #include \.h\ TcpClientSocket::TcpClientSocket(QObject *parent) { connect(this, SIGNAL(readyRead()),this, SLOT(dataReceived())); connect(this, SIGNAL(disconnected()),this, SLOT(slotDisconnected())); }TcpClientSocket::~TcpClientSocket() { } voidTcpClientSocket::dataReceived() { while (bytesAvailable()>0) { charbuf[1024]; int length=bytesAvailable(); read(buf, length); QStringmsg=buf; emitupdateClients(msg,length); } } voidTcpClientSocket::slotDisconnected() { emit disconnected(this->socketDescriptor ()); } Tcpserve.cpp #include \.h\ TcpServer::TcpServer(QWidget *parent, Qt::WindowFlags f ) : QWidget( parent, f ) { QFontfont(\setFont(font); setWindowTitle(tr(\网络\ QVBoxLayout *vbMain = new QVBoxLayout( this ); ListWidgetContent = new QListWidget( this); vbMain->addWidget( ListWidgetContent ); QHBoxLayout *hb = new QHBoxLayout( ); LabelPort = new QLabel( this ); LabelPort->setText(tr(\端口:\hb->addWidget( LabelPort ); LineEditPort = new QLineEdit(this); hb->addWidget( LineEditPort ); vbMain->addLayout(hb); PushButtonCreate = new QPushButton( this); PushButtonCreate->setText( tr( \启动\vbMain->addWidget( PushButtonCreate ); connect(PushButtonCreate,SIGNAL(clicked()),this,SLOT(slotCreateServer())); port = 8089; LineEditPort->setText(QString::number(port)); } TcpServer::~TcpServer() { } voidTcpServer::slotCreateServer() { server = new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int))); PushButtonCreate->setEnabled(false); } voidTcpServer::updateServer(QStringmsg,int length) { ListWidgetContent->addItem (msg.left(length) ); } Main.cpp #include \.h\#include int main( intargc, char **argv ) {