QT·Î ÀÛ¼ºÇÏ´Â HTTP Server ¼ÀÇÃ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Replace original file
Rename if it already exist

¼Ò°³

À̹ø¿¡´Â QT¿¡¼­ Á¦°øÇÏ´Â SocketServer Ŭ·¡½º¸¦ ÅëÇØ¼­ °£´ÜÇÑ HTTP Server¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.

kdevelop(12)¸¦ ÀÌ¿ëÇØ¼­ ±¸ÇöÀ» Çϵµ·ÏÇϰڴÙ. UI´Â designer(12)¸¦ ÀÌ¿ëÇϵµ·Ï ÇÑ´Ù. ƯÈ÷ kdevlop 3.2ºÎÅÍ´Â designer°ú ÅëÇÕµÈ °³¹ßȯ°æÀ» Á¦°øÇÏ´Â ÀÌÀ¯·Î Á»´õ ½±°Ô UI°³¹ß °ü·Ã ÀÛ¾÷À» ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.

qsocketserver1.jpg

HTTP Server ±¸Çö

QServerSocket Class

QServerSocket´Â TCP±â¹ÝÀÇ ³×Æ®¿öÅ© ¼­¹ö¸¦ °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ´ÜÁö Æ÷Æ®¸¦ ÁöÁ¤ÇÏ´Â Á¤µµ·Î µè±â ¼ÒÄÏÀ» »ý¼ºÇÒ ¼ö ÀÖÀ̸ç, ¿¬°áµÈ Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍÀÇ Àбâ¿Í ¾²±â´Â QTÀÇ signal/slot¸¦ ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.

»õ·Î¿î ¿¬°á¿¡ ´ëÇÑ Ã³¸®´Â newConnection()Çڵ鷯¸¦ ¼öÁ¤ÇÏ¸é µÉ »ÓÀÌ´Ù.

ÇÁ·ÎÁ§Æ® »ý¼º

kdevelop¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. kdevelop´Â ´Ù¾çÇÑ ÇÁ·ÎÁ§Æ® ÅÛÇø´À» Á¦°øÇϴµ¥, QT App Àü¿ëÀÇ ÅÛÇø´Àº ¾øÀ¸¹Ç·Î C++ > KDE ÅÛÇø´À» ÀÌ¿ëÇϵµ·Ï ÇÑ´Ù. ¾à°£¸¸ ¼öÁ¤Çϸé QTÀü¿ë APP »ý¼ºÀÌ °¡´ÉÇϹǷΠũ°Ô ¹®Á¦µÉ°Ç ¾øÀ» °ÍÀÌ´Ù.
´ÙÀ½Àº ¼öÁ¤À» ¸¶Ä£ main.cppÆÄÀÏÀÌ´Ù.
#include "simplewebserver.h" 
#include <qapplication.h> 
 
static const char version[] = "0.1"; 
 
 
int main(int argc, char **argv) 
{ 
 
 
    QApplication app(argc, argv); 
    SimpleWebServer *mainWin = 0; 
 
    mainWin = new SimpleWebServer(); 
    app.setMainWidget( mainWin ); 
    mainWin->show(); 
    return app.exec(); 
} 
 

UI µðÀÚÀÎ

UI´Â designer¸¦ ÅëÇØ ±¸ÇöÇϵµ·Ï ÇϰڴÙ. ¾Æ·¡¿Í °°ÀÌ °£´ÜÇÏ°Ô ±¸¼ºÇϵµ·Ï ÇϰڴÙ.

qsocketserver2.jpg

LineEdit´Â Æ÷Æ®¹øÈ£¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. Start ¹öưÀ» ´©¸£¸é ¼­¹ö°¡ ÀÛµ¿Çϸç, Close ¹öưÀ» ´©¸£¸é ÇÁ·Î±×·¥Àº Á¾·áµÈ´Ù. °¡Àå ¾Æ·¡¿¡ ÀÖ´Â TextEdit´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÁ¤º¸¸¦ Ãâ·ÂÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. TextEdit´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á, Á¾·á, Read¿Í °°Àº À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§ À̸¦ Ãâ·ÂÇÏ°Ô µÈ´Ù.

designer¸¦ ÅëÇØ¼­ UI¸¦ ¸¸µå´Â ÀÚ¼¼ÇÑ ¹æ¹ýÀº QT ¹Ì´Ï»çÀÌÆ®ÀÇ ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù. ¿©±â¿¡¼­´Â °£´ÜÇÏ°Ô ¼³¸íÇÏ°í ³Ñ¾î°¡µµ·Ï ÇϰڴÙ.

File > New ¸¦ ÀÌ¿ëÇϸé, »õ·Î¿î ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏÀÇ Å¸ÀÔÀº Widget(.ui)·Î ÇÏ°í ÆÄÀÏÀ̸§Àº WebUI·Î ÇϰڴÙ.

±×·¯¸é designer°¡ ½ÇÇàµÈ´Ù. ÀÌÈÄ UIµðÀÚÀÎÀº ´ëÃæ ºñ½ÁÇÏ°Ô ¸¸µé¾î º¸±â ¹Ù¶õ´Ù. ÀÌ ¿¹Á¦¿¡¼­ ÃÖ»óÀ§ ºÎ¸ð wigetÀÇ À̸§Àº Form1À¸·Î Çß´Ù. Form1Àº À§Á¬ÀÇ Å¬·¡½º À̸§À¸·Î »ç¿ëÀÌ µÈ´Ù.

¸¸µé¾îÁø UI´Â XML Çü½ÄÀ¸·Î ÀúÀåµÈ´Ù. À̸¦ QT¿¡ ºÙÀ̱â À§Çؼ­´Â uic¸¦ ÀÌ¿ëÇØ¼­ Çì´õÆÄÀϰú cpp ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.
# uic -o WebUI.h WebUI.ui  
# uic -o WebUI.cpp -i WebUI.h WebUI.ui  
 
´ÙÀ½Àº ÀÌ·¸°Ô ÇØ¼­ ¸¸µé¾îÁø Form1 Ŭ·¡½º¿Í ¿©±â¿¡ Æ÷ÇÔµÈ ¸â¹öÇÔ¼ö¿Í ¸â¹öº¯¼öµéÀÌ´Ù. ´ë·« º¸¸é °¢ ¸â¹öº¯¼ö°¡ ¾î¶² Wedget°ú °ü·ÃµÈ °ÍÀÎÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±¸Çö ÄÚµå

#ifndef _SIMPLEWEBSERVER_H_ 
#define _SIMPLEWEBSERVER_H_ 
 
#ifdef HAVE_CONFIG_H 
#include <config.h> 
#endif 
 
#include <stdlib.h> 
#include "WebUI.h" 
 
#include <qtextstream.h> 
#include <qregexp.h> 
#include <qwidget.h> 
#include <qserversocket.h> 
#include <qsocket.h> 
#include <qmessagebox.h> 
#include <qtextedit.h> 
/** 
 * @short Application Main Window 
 * @author yundream <yundream@joinc.co.kr> 
 * @version 0.1 
 */ 
class SimpleWebServer : public Form1 
{ 
    Q_OBJECT 
public: 
    /** 
     * Default Constructor 
     */ 
    SimpleWebServer(QWidget *parent = 0, const char *name=0); 
 
    /** 
     * Default Destructor 
     */ 
    virtual ~SimpleWebServer(); 
 
private slots: 
    void Connected(); 
    void Close(); 
 
    // »õ·Î¿î ¿¬°áÀÌ ¹ß»ýÇßÀ» ¶§ Ãâ·ÂÇÒ ¸Þ½ÃÁö 
    void newConnectmsg() 
    { 
        ShowInfo->append("New Connection"); 
    } 
 
    // ¿¬°áÀÌ Á¾·áµÇ¾úÀ» ¶§ Ãâ·ÂÇÒ ¸Þ½ÃÁö 
    void endConnectmsg() 
    { 
        ShowInfo->append("Close Connection"); 
    } 
 
    // Ŭ¶óÀÌ¾ðÆ®·Î µ¥ÀÌÅ͸¦ º¸³ÂÀ» ¶§ ¹ß»ýÇÒ ¸Þ½ÃÁö 
    void wroteToClientmsg() 
    { 
        ShowInfo->append("Send Message"); 
    } 
 
private: 
    int PortNum; 
}; 
 
 
// ------------------------------------------ 
class Acceptor : public QServerSocket 
{ 
    Q_OBJECT 
public: 
    Acceptor(int Pnum, QObject *parent=0) : QServerSocket(Pnum,1, parent) 
    { 
      if (!ok()) 
      { 
           qWarning("Failed to bind port"); 
      } 
      else 
      { 
           qWarning("Success to bind port"); 
      } 
    } 
 
    void newConnection(int socket) 
    { 
        QSocket *sockfd = new QSocket(this); 
        // readRead ½Ã±×³ÎÀÌ ¹ß»ýÇÒ °æ¿ì readClinet ¿¡¼­ À̸¦ ó¸®ÇÑ´Ù. 
        connect(sockfd, SIGNAL(readyRead()), this, SLOT(readClient())); 
        connect(sockfd, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient())); 
        // ¼ÒÄÏÀ» »ý¼ºÇϰí newConnect ½Ã±×³ÎÀ» º¸³½´Ù. 
        sockfd->setSocket(socket); 
        emit newConnect(); 
    } 
 
signals: 
    void newConnect(); 
    void endConnect(); 
    void wroteToClient(); 
 
private slots: 
    void discardClient(); 
 
    // Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍ HTTP ¿äûÀ» ÀоîµéÀÌ°í  
    // ó¸®ÇÑ´Ù. 
    void readClient() 
    { 
      qWarning("Debug1"); 
      QSocket *socket = (QSocket *)sender(); 
      qWarning("Debug2"); 
      if (socket->canReadLine()) 
      { 
        qWarning("Read Message "); 
        QStringList tokens = QStringList::split(QRegExp("[ \n][ \n]*"), socket->readLine()); 
        if(tokens[0] == "GET") 
        { 
            QTextStream os(socket); 
            os.setEncoding( QTextStream::UnicodeUTF8 ); 
            os << "HTTP/1.0 200 Ok\n" 
                    "Content-Type: text/html; charset=\"utf-8\"\n" 
                    "\n" 
                    "<h1>Hello World</h1>\n"; 
            socket->close(); 
            // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô µ¥ÀÌÅ͸¦ Àü¼ÛÇßÀ½À» ¾Ë·ÁÁØ´Ù. 
            emit wroteToClient(); 
        } 
      } 
      else 
      { 
          qWarning("Not REad Message"); 
      } 
    }  
}; 
#endif // _SIMPLEWEBSERVER_H_ 
 

 
#include <qserversocket.h> 
#include <qmessagebox.h> 
#include <qlineedit.h> 
#include <qpushbutton.h> 
 
using namespace std; 
 
SimpleWebServer::SimpleWebServer(QWidget *parent, const char *name) 
    : Form1(parent, name) 
{ 
    // Start ¹öưÀ» Ŭ¸¯ÇÏ¸é µè±â ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù. 
    connect(StartButton, SIGNAL(clicked()), this, SLOT(Connected())); 
} 
 
SimpleWebServer::~SimpleWebServer() 
{ 
} 
 
/* 
 * Web Server Start 
*/ 
void SimpleWebServer::Connected() 
{ 
    string PortStr = PortInput->text(); 
    Acceptor *httpd = new Acceptor(atoi(PortStr.c_str()), this); 
    ShowInfo->append("Server Daemon Start!!"); 
    connect(httpd, SIGNAL(newConnect()), this, SLOT(newConnectmsg())); 
    connect(httpd, SIGNAL(endConnect()), this, SLOT(endConnectmsg())); 
    connect(httpd, SIGNAL(wroteToClient()), this, SLOT(wroteToClientmsg())); 
 
} 
 
void SimpleWebServer::Close() 
{ 
    ShowInfo->append("Server Daemon Close!!"); 
} 
 
 
// Acceptor Class Member------------------------ 
void Acceptor::discardClient() 
{ 
    QSocket *socket = (QSocket *)sender(); 
    delete socket; 
    emit endConnect(); 
} 
 

´ÙÀ½Àº Å×½ºÆ® °á°ú´Ù.

qsocketserver4.jpg
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.