QT中的网络编程实例Qclient.h/**************************************************************************** ** $Id: /sample/10/qclient.h 2.3.2 edited 2004-10-12 $**** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved.** ** This file is part of an example program for Qt. This example** program may be used, distributed and modified without limitation. *******************************************************************************/#ifndef QCLIENT_H#define QCLIENT_H#include <qsocket.h>#include <qapplication.h>#include <qvbox.h>#include <qhbox.h>#include <qtextview.h>#include <qlineedit.h>#include <qlabel.h>#include <qpushbutton.h>#include <qtextstream.h>class QClient : public QWidget{Q_OBJECTpublic:QClient(QWidget *parent = 0, const char *name = 0);private slots:void closeConnection();void sendToServer();void connectToServer();void socketReadyRead();void socketConnected();void socketConnectionClosed();void socketClosed();void socketError(int);private:QSocket *socket;QTextView *infoText;QLineEdit *addrText;QLineEdit *portText;QLineEdit *inputText;};#endif //QCLIENT_HQclient.cpp/**************************************************************************** ** $Id: /sample/10/qclient.h 2.3.2 edited 2004-10-12 $**** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved.** ** This file is part of an example program for Qt. This example** program may be used, distributed and modified without limitation. *******************************************************************************/ #include "qclient.h"#include <qsocket.h>#include <qapplication.h>#include <qvbox.h>#include <qhbox.h>#include <qtextview.h>#include <qlineedit.h>#include <qlabel.h>#include <qlayout.h>#include <qpushbutton.h>#include <qtextstream.h>#include <qpoint.h>QClient::QClient(QWidget *parent, const char *name): QWidget(parent, name){infoText = new QTextView(this);QHBox *hb = new QHBox(this);inputText = new QLineEdit(hb);QHBox *addrBox = new QHBox(this);QLabel *ip = new QLabel("IP:", addrBox, "ip");ip->setAlignment(1);addrText = new QLineEdit(addrBox);QLabel *port = new QLabel("PORT:", addrBox, "port");port->setAlignment(1);portText = new QLineEdit(addrBox);QHBox *buttonBox = new QHBox(this);// QPushButton *Connect = new QPushButton(tr("Connect"), this); QPushButton *send = new QPushButton(tr("Send"), hb); QPushButton *close = new QPushButton(tr("Close connection"), buttonBox);QPushButton *quit = new QPushButton(tr("Quit"), buttonBox); QPushButton *Connect = new QPushButton(tr("Connect"), addrBox);connect(send, SIGNAL(clicked()),SLOT(sendToServer()) );connect(close, SIGNAL(clicked()),SLOT(closeConnection()) );connect(quit, SIGNAL(clicked()),qApp, SLOT(quit()) );connect(Connect, SIGNAL(clicked()),SLOT(connectToServer()) );//create the socket and connect various of its signalssocket = new QSocket(this);connect(socket, SIGNAL(connected()),SLOT(socketConnected()) );connect(socket, SIGNAL(connectionClosed()),SLOT(socketConnectionClosed()) );connect(socket, SIGNAL(readyRead()),SLOT(socketReadyRead()) );connect(socket, SIGNAL(error(int)),SLOT(socketError(int)) );QVBoxLayout *l = new QVBoxLayout(this);l->addWidget(infoText, 10);l->addWidget(hb, 1);l->addWidget(addrBox, 1);l->addWidget(buttonBox, 1);// l->addWidget(Connect, 1);// l->addWidget(close, 1);// l->addWidget(quit, 1);//connect to the serverinfoText->append(tr("Tying to connect to the server"));// socket->connectToHost(host, port);}void QClient::closeConnection(){socket->close();if (QSocket::Closing == socket->state()) {// We have a delayed closeconnect(socket, SIGNAL(delayedCloseFinished()),SLOT(socketClosed()));} else {// The socket is closedsocketClosed();}}void QClient::sendToServer(){// write to the serverif (QSocket::Connected == socket->state()) {QTextStream os(socket);os << inputText->text() << "\n";inputText->setText("");} else {// The socket is unconnectedinfoText->append(tr("The server is lost\n"));}}void QClient::connectToServer(){// connect to the serversocket->connectToHost(addrText->text(), (portText->text()).toInt()); }void QClient::socketReadyRead(){// read from the serverwhile (socket->canReadLine()) {infoText->append(socket->readLine());}}void QClient::socketConnected(){infoText->append(tr("Connected to server\n"));}void QClient::socketConnectionClosed(){infoText->append(tr("Connection closed by the server\n"));}void QClient::socketClosed(){infoText->append(tr("Connection closed\n"));}void QClient::socketError(int e){if (e == QSocket::ErrConnectionRefused) {infoText->append(tr("Connection Refused\n"));} else if (e == QSocket::ErrHostNotFound) {infoText->append(tr("Host Not Found\n"));} else if (e == QSocket::ErrSocketRead) {infoText->append(tr("Socket Read Error\n"));}}Main.cpp/**************************************************************************** ** $Id: /sample/10/main.cpp 2.3.2 edited 2004-10-12 $**** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved.** ** This file is part of an example program for Qt. This example** program may be used, distributed and modified without limitation. *******************************************************************************/#include <qapplication.h>#include "qclient.h"int main( int argc, char **argv ){QApplication app( argc, argv );QClient *client = new QClient( 0 );app.setMainWidget( client );client->show();int result = app.exec();return result;}Server.cpp/****************************************************************************** $Id: qt/server.cpp 3.0.5 edited Oct 12 2001 $**** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.**** This file is part of an example program for Qt. This example** program may be used, distributed and modified without limitation.*******************************************************************************/#include <qsocket.h>#include <qserversocket.h>#include <qapplication.h>#include <qvbox.h>#include <qtextview.h>#include <qlabel.h>#include <qpushbutton.h>#include <qtextstream.h>#include <stdlib.h>/*The ClientSocket class provides a socket that is connected with a client.For every client that connects to the server, the server creates a newinstance of this class.*/class ClientSocket : public QSocket{Q_OBJECTpublic:ClientSocket( int sock, QObject *parent=0, const char *name=0 ) : QSocket( parent, name ){line = 0;connect( this, SIGNAL(readyRead()), SLOT(readClient()) );connect( this, SIGNAL(connectionClosed()), SLOT(connectionClosed()) );setSocket( sock );}~ClientSocket(){}private slots:void readClient(){while ( canReadLine() ) {QTextStream os( this );os << line << ": " << readLine();line++;}}void connectionClosed(){delete this;}private:int line;};/*The SimpleServer class handles new connections to the server. For every client that connects, it creates a new ClientSocket -- that instance is now responsible for the communication with that client.*/class SimpleServer : public QServerSocket{Q_OBJECTpublic:SimpleServer( QObject* parent=0 ) :QServerSocket( 4242, 1, parent ){if ( !ok() ) {qWarning("Failed to bind to port 4242");exit(1);}}~SimpleServer(){}void newConnection( int socket ){(void)new ClientSocket( socket, this );emit newConnect();}signals:void newConnect();};/*The ServerInfo class provides a small GUI for the server. It also creates the SimpleServer and as a result the server.*/class ServerInfo : public QVBox{Q_OBJECTpublic:ServerInfo(){SimpleServer *server = new SimpleServer( this );QString itext = QString("This is a small server example.\n""Connect with the client now.");QLabel *lb = new QLabel( itext, this );lb->setAlignment( AlignHCenter );infoText = new QTextView( this );QPushButton *quit = new QPushButton( "Quit" , this );connect( server, SIGNAL(newConnect()), SLOT(newConnect()) );connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );}~ServerInfo(){}private slots:void newConnect(){infoText->append( "New connection\n" );}private:QTextView *infoText;};int main( int argc, char** argv ){QApplication app( argc, argv );ServerInfo info;app.setMainWidget( &info );info.show();return app.exec();}#include "server.moc"以上四个文件,Qclient.h 、Qclient.cpp和Main.cpp 是客户端的程序编译后,在qvfb 上运行,Server.cpp为服务端,编译后,运行在Xwindows上。