基于TCP的网络聊天程序

发布时间 : 星期二 文章基于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); QListtcpClientSocketList; signals:

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 #include \.h\

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 #include \.h\

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 ) {

联系合同范文客服:xxxxx#qq.com(#替换为@)