实现一个基本上最简单的QTcpServer来收发数据。 #include <QtCore/QCoreApplication> #include <QTcpServer> #include <QTcpSocket> #include <QThread> class ServerThread:public QThread { public: ServerThread(int fd, QObject *parent); void run(); private: int m_fd; }; ServerThread::ServerThread(int fd, QObject *parent):QThread(parent) { m_fd = fd; } void ServerThread::run() { /* 在这个进程里,读取数据,写出数据 */ qDebug("I'm Here"); QTcpSocket socket; /* 根据手册要这么使用 */ if (!socket.setSocketDescriptor(m_fd)) { qDebug("Socket error!"); return; } #if 1 /* 阻塞,等待数据的到来 */ socket.waitForReadyRead(-1); QByteArray rbuf = socket.readAll(); qDebug("RCV:%s",rbuf.data()); #endif #if 1 QByteArray wbuf; wbuf.append("I RCVed the data/n"); socket.write(wbuf.data()); socket.waitForBytesWritten(-1); /* 等待数据写完,不加这个函数,接收方总是只能接收到空数据,长度为0 */ qDebug("I'v send the data"); #endif } class Server : public QTcpServer { public: Server(); private: /* 当产生一个新的连接的时候,会调用这个函数 所以可以在我们定义的类中,把它改写覆盖掉, 继承来的父类,这个函数是虚函数 */ void incomingConnection(int sockDescriptor); }; Server::Server():QTcpServer() { } void Server::incomingConnection(int sockDescriptor) { /* 在这里面开辟一个线程来处理连接 */ ServerThread *thread = new ServerThread(sockDescriptor, this); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Server server; /* 监听了所有网络接口,9876端口 */ if ( !server.listen(QHostAddress::Any, 9876)) { qCritical("Cannot listen to port 9876."); server.close(); return 1; } return a.exec(); }