• 5490阅读
  • 1回复

[提问]关于一个TCP的通信问题 [复制链接]

上一主题 下一主题
离线wizardxbl
 

只看楼主 倒序阅读 楼主  发表于: 2011-02-20
先说一下需求:QT负责界面显示,LINUX C负责其他的事情,由C发数据给QT,然后QT做出显示。比如C发1,QT就显示个1。
问题:我不怎么会QT,参考C++ GUI QT4编程里面的TCP部分,写了个server的程序,然后用C写客户端,C这边提示能够建立连接,QT那边也进入到处理链接的函数了,可是,我不知道怎么把收到的数据显示出来,或者说不知道收到了什么数据。没有界面,我还不知道怎么加个label之类的进去……。下面贴出来QT的代码,希望各位大大,多多指教。
main.cpp
  1. #include <QtGui/QApplication>
  2. #include "server.h"
  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication app(argc, argv);
  6.     TripServer server;
  7.    if (!server.listen(QHostAddress::Any, 6178)) {
  8.         fprintf(stderr,"Failed to bind to port\n");
  9.         return 1;
  10.     }
  11.     //server.show();
  12.     return app.exec();
  13. }

server.h
  1. #ifndef SERVER_H
  2. #define SERVER_H
  3. #include <QtGui/QWidget>
  4. #include <QTcpServer>
  5. #include <QTcpSocket>
  6. #include <QString>
  7. #include <QDate>
  8. class TripServer : public QTcpServer
  9. {
  10.     Q_OBJECT
  11. public:
  12.     TripServer(QObject *parent=0);
  13. private:
  14.     void incomingConnection(int socketId);
  15. };
  16. class ClientSocket : public QTcpSocket
  17. {
  18.     Q_OBJECT
  19. public:
  20.     ClientSocket(QObject *parent=0);
  21. private slots:
  22.     void readClient();
  23. private:
  24.     void generateRandomTrip(const QString &from, const QString &to, const QDate &date, const QTime &time);
  25.     quint16 nextBlockSize;
  26. };
  27. #endif // SERVER_H

server.cpp
  1. #include "server.h"
  2. TripServer::TripServer(QObject *parent):QTcpServer(parent)
  3. {
  4. }
  5. void TripServer::incomingConnection(int socketId)
  6. {
  7.     ClientSocket *socket = new ClientSocket(this);
  8.     socket->setSocketDescriptor(socketId);
  9. }
  10. ClientSocket::ClientSocket(QObject *parent):QTcpSocket(parent)
  11. {
  12.     connect(this, SIGNAL(readyRead()),this,SLOT(readClient()));
  13.     connect(this,SIGNAL(disconnected()),this,SLOT(deleteLater()));
  14.     nextBlockSize = 1;
  15. }
  16. void ClientSocket::readClient()
  17. {
  18.     QDataStream in(this);
  19.     if (nextBlockSize==0) {
  20.         if(bytesAvailable()<sizeof(quint16)) {
  21.             fprintf(stderr,"-AAAA-");
  22.             return;
  23.         }
  24.         fprintf(stderr,"-BBBB-");
  25.         in >> nextBlockSize;
  26.     }
  27.     if (bytesAvailable()<nextBlockSize) {
  28.         fprintf(stderr,"-CCCC[%d]-",nextBlockSize);
  29.         return;
  30.     }
  31. fprintf(stderr,"-ABCD-");
  32.     quint8 requestType;
  33.     QString from;
  34.     QString to;
  35.     QDate date;
  36.     QTime time;
  37.     quint8 flag;
  38.     QString tmp1 = "a";
  39.     QString tmp2;
  40.     //in >> requestType;
  41.     in >> tmp2;
  42.     if (tmp2 == tmp1)
  43.         fprintf(stderr,"A!\n");
  44.     QByteArray tmp = tmp2.toLatin1();
  45.     fprintf(stderr,"[%s]\n",(const char *)tmp);
  46. /*
  47.     if (requestType == 'S') {
  48.             in >> from >> to >> date >> time >> flag;
  49.             //std::srand(from.length()*3600+to.length()*60+time.hour());
  50.             int numTrips = 5;//std::rand()%8;
  51.             for (int i = 0; i<numTrips; ++i) {
  52.                 generateRandomTrip(from,to,date,time);
  53.             }
  54.             QDataStream out(this);
  55.             out << quint16(0x41);
  56.     }
  57.   */
  58.     //close();
  59. }
  60. void ClientSocket::generateRandomTrip(const QString &, const QString &, const QDate &date, const QTime &time)
  61. {
  62.     QByteArray block;
  63.     QDataStream out(&block, QIODevice::WriteOnly);
  64.     out.setVersion(QDataStream::Qt_4_0);
  65.     quint16 duration = 5;//std::rand()%200;
  66.     out << quint16(0) << date << time << duration << quint8(1) << QString("InterCity");
  67.     out.device()->seek(0);
  68.     out << quint16(block.size()-sizeof(quint16));
  69.     write(block);
  70. }

离线morriszy

只看该作者 1楼 发表于: 2011-02-21
增加一个MainWindow或者Widget呀!
VS2010+Qt4.7.0
快速回复
限100 字节
 
上一个 下一个