ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. ¼Ò°³
À̹ø¿¡´Â QT¿¡¼ Á¦°øÇÏ´Â SocketServer Ŭ·¡½º¸¦ ÅëÇØ¼ °£´ÜÇÑ HTTP Server¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.
kdevelop(12)¸¦ ÀÌ¿ëÇØ¼ ±¸ÇöÀ» Çϵµ·ÏÇϰڴÙ. UI´Â designer(12)¸¦ ÀÌ¿ëÇϵµ·Ï ÇÑ´Ù. ƯÈ÷ kdevlop 3.2ºÎÅÍ´Â designer°ú ÅëÇÕµÈ °³¹ßȯ°æÀ» Á¦°øÇÏ´Â ÀÌÀ¯·Î Á»´õ ½±°Ô UI°³¹ß °ü·Ã ÀÛ¾÷À» ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ![]() 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¸¦ ÅëÇØ ±¸ÇöÇϵµ·Ï ÇϰڴÙ. ¾Æ·¡¿Í °°ÀÌ °£´ÜÇÏ°Ô ±¸¼ºÇϵµ·Ï ÇϰڴÙ. ![]()
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();
}
´ÙÀ½Àº Å×½ºÆ® °á°ú´Ù.
![]() |
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|