HJ's WebServer 0.3 ¶
- ìœ ì—°í•œ 마임타입 ì„¤ì •ìœ¼ë¡œ 하ì�´í�¼ í…�스트는 ë¬¼ë¡ ì�´ê³ , ì�´ë¯¸ì§€ 삽입, 멀티미디어 재ìƒ�, 파ì�¼ 다운로드ë�„ 모ë‘� 가능함
- 웹서버ì—�서 PHP 스í�¬ë¦½íŠ¸ë¥¼ ì‹¤í–‰í• ìˆ˜ 있ì�Œ (ì§€ì›�하는 확장ìž� : html, htm, php)
- ë””ë ‰í† ë¦¬ëª…ìœ¼ë¡œ ì ‘ê·¼í•œ 경우 index.html, index.htm, index.php 순서로 ê°€ì ¸ì˜´
- ì•„ì§� 다양한 보안 ë¬¸ì œì—� 대한 í•´ê²° 방법ì�„ ë§ˆë ¨í•´ë†“ì§€ 않아, ì§€ì •ë�œ ë””ë ‰í† ë¦¬ì—� 있는 파ì�¼ë§Œì�„ ë³´ì�´ë�„ë¡� 허용함
To Do.. ¶
- GET Method으로 넘어온 Query String를 처리한다.
- POST Method, COOKIE 등으로 넘어온 ë�°ì�´í„°ê¹Œì§€ ì²˜ë¦¬í• ìˆ˜ 있으면 ë�” 좋다.
소스코드 ¶
~php
<?
$index_file = array("index.html", "index.htm", "index.php");
$host = "IP 주소 �는 �메� 네임";
$port = 8080;
set_time_limit(0);
if(!function_exists("mime_content_type"))
{
function mime_content_type($f)
{
return exec(trim("file -bi ".escapeshellarg($f)));
}
}
//echo str_repeat(" ",300);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_setopt($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_listen($socket);
$i = 100;
while($i--)
{
$client_socket = socket_accept($socket);
$result = "";
while(false!==($read = socket_read($client_socket, 100, PHP_NORMAL_READ)))
{
echo "> ".$read;
if(!$read = trim($read)) $cnt++;
else $cnt=0;
if($cnt==3) break;
flush();
if(preg_match("/(GET|POST) (\/[^ \/]*) (HTTP\/[0-9]+.[0-9]+)/i", $read, $t))
{
$file = "/home/kesarr".$t[2];
if(preg_match("/\/$/", $file))
{
foreach($index_file as $idxf)
{
if(is_readable($file.$idxf))
{
$file .= $idxf;
break;
}
}
}
if(is_readable($file))
{
$size = @getimagesize($file);
if($size['mime']) $mime = $size['mime'];
else $mime = mime_content_type($file);
$res[] = "HTTP/1.1 200 OK";
$res[] = "Server: Kesarr's WebServer";
$res[] = "Connection: close";
$to_read = $file;
}
else
{
$res[] = "HTTP/1.1 404 Not Found";
$res[] = "Server: Kesarr's WebServer";
$res[] = "Content-Length: ".strlen("파�� 찾� 수 없습니다.");
$res[] = "Connection: close";
$res[] = "Content-Type: $size[mime];charset=UTF-8;";
$res[] = "";
$res[] = "파�� 찾� 수 없습니다.";
}
}
if($read == "close")
{
break;
}
elseif($read == "a")
{
$result = $read;
}
elseif($read == "exit")
{
socket_close($client_socket);
socket_close($socket);
exit;
}
}
if($res)
{
if($to_read)
{
if(preg_match("/\.(html|htm|php)$/", $to_read))
{
$buffer = shell_exec(trim("php ".escapeshellarg($to_read)));
$res[] = "Content-Length: ".strlen($buffer);
$res[] = "";
$result = join("\r\n", $res);
@socket_write($client_socket, $result);
echo $result;
@socket_send($client_socket, $buffer, strlen($buffer), 0);
$buf = explode("\r\n\r\n", $buffer);
echo $buf[0]."\r\n\r\nPHP Parse: ";
}
else
{
$res[] = "Content-Length: ".filesize($file);
$res[] = "Content-Type: ".$mime;
$res[] = "";
$res[] = "";
$result = join("\r\n", $res);
@socket_write($client_socket, $result);
echo $result;
@socket_send($client_socket, $buffer, strlen($buffer), 0);
if(preg_match("/^text\//", $mime))
{
$fp = fopen($to_read, "r");
echo "ASCII Read: ";
}
else
{
$fp = fopen($to_read, "rb");
echo "Binary-safe Read: ";
}
while(!feof($fp)){
$buffer=fread($fp,128);
@socket_send($client_socket, $buffer, strlen($buffer), 0);
}
fclose($fp);
}
echo $to_read;
}
else
{
$result = join("\r\n", $res);
socket_write($client_socket, $result);
echo $result;
}
echo "\r\n__EOF__\r\n\r\n";
flush();
}
socket_close($client_socket);
unset($res);
unset($to_read);
unset($result);
}
socket_close($socket);
?>
형진ì�´ 다 만들었네. ã…‹ã…‹ 잘했다. 한가지 ë¶€íƒ�í• ê±´ 컴공으로 ë¨¹ê³ ì‚´ë�¼ë©´ ë�„ë©”ì�¸ 언어를 C나 Java로 바꾸는 게 í•„ìš”í• ê²ƒ 같다. - eternalbleu
- PHP로 짜면 스í�¬ë¦½íЏ 언어 특성ìƒ� 프로그래ë°�ì�´ ì¦�ê²�ë‹¤ê³ ë‚˜ í• ê¹Œìš”? 그런 ëŠ�낌ì�´ 좋아서 PHP를 ì„ í˜¸í•˜ê¸´ 하지만, UI를 ì œì™¸í•œ 코어 루틴만í�¼ì�€ ë ˆí�¼ëŸ°ìŠ¤ì™€ 샘플ì�„ 함께하면 대부분ì�˜ 언어로 ê°™ì�€ 루틴ì�„ 만들 수 있ì�„ ê±°ë�¼ê³ ìƒ�ê°�í•´ìš”. 그래ë�„ ì–´ëŠ�ì •ë�„는 비 웹언어ì—� ì�µìˆ™í•´ì ¸ì•¼ 하지않ì�„까 ì‹¶ì–´ C++, Java, C#ì�„ ê³ ë¯¼í•˜ë‹¤ C#ì�„ ì„ íƒ�해서 해봤는ë�°, C#ì�´ í�´ë�¼ì�´ì–¸íŠ¸ë‹¨ 어플리케ì�´ì…˜ì—�서ë�„ 효용성ì�„ ê°€ì§€ë ¤ë©´ Windows Vistaê°€ 출시ë�œ 후ì�˜ ìƒ�황ì�„ 지켜ë´�야 í• ê²ƒ ê°™ê³ , ì•„ì§�ì�€ C/C++ì�´ ë�” 대세ì�¸ê±´ 분명해보ì�´ë„¤ìš”. 사실 ì €ê°™ì�€ 경우ì—�는 ì•„ì§�ì�€ ì—°êµ¬í•˜ê³ ì‹¶ì�€ 관심사가 '대용량 ë�°ì�´í„°ë² ì�´ìФ 기반 검색 엔진'ê³¼ '형태소 ë¶„ì„� 기반 ìž�ì—°ì–´ 처리'로 DB와 문ìž�ì—´ 처리ì—� 관한 부분ì�¸ë�°, DB 처리는 ì�¼ë‹¨ RDBMSì—�서만í�¼ì�€ PHP처럼 수월한 언어가 ì—†ê³ , 문ìž�ì—´ 처리는 Perlì�´ 다른 언어들ì—� 비해 월등하다보니 그런 언어를 ë�„ë©”ì�¸ 언어로 해오지 않았나 싶네요. ã…‹ã…‹ - 변형진
- ë‚´ê°€ PHP ë�„ 약간 í•´ë³´ê³ , JSP 나 Java ë�„ 약간 해봤서 대충 ì‹¬ì •ì�„ 알듯.. 나ë�„ JSPëž‘ Java ì�¨ì„œ ì�´ë²ˆì—� DB 프로ì �트 개발 í•´ë³´ê¸°ì „ì—�는 웹ì—�서는 PHP로 짜는게 가장 편하게 ëŠ�ê»´ì¡Œì—ˆê±°ë“ . 그래서 DB 프로ì �트ë�„ 웹ì�€ PHP ì�‘ìš©ì�€ Java ì�´ë ‡ê²Œ í•´ ë‚˜ê°ˆë ¤ê³ í–ˆëŠ”ë�° PHPê°€ Oracle ì§€ì›�ì�€ ë²„ì „ 5.x 부터 ë�˜ì„œ ê±� Jsp로 하게 ë��ì§€. 둘다 해본 소ê°�ì�€ 언어ì �ì�¸ ë©´ì—�서는 ë� PHP로 하나 Jsp로 하나 별 ìƒ�ê´€ì�´ 없는거 ê°™ê³ , 다만 ê²°ì • ì �ì�¸ê²ƒì�€ 개발환경ë°� Jsp ì—�서는 java í�´ëž˜ìŠ¤ë¥¼ ê°€ì ¸ë‹¤ê°€ ì‚¬ìš©í• ìˆ˜ 있다는 ì �ì�´ì—ˆìФ. Jspì—�서 하면 Junit ì�„ 사용하여 Unit 테스트를 하면서 작성하기 ìˆ˜ì›”í–ˆê³ , ë˜�한 디버깅 환경ë�„ Visual Studio ì—�서 디버깅 하듯ì�´ 웹ì�„ 한다는게 ì •ë§� 좋았지. ë˜� java í�´ëž˜ìŠ¤ë¥¼ ê°€ì ¸ë‹¤ê°€ ì‚¬ìš©í• ìˆ˜ 있어서 여러 오픈 소스를 활용하기ì—�ë�„ ì¢‹ê³ .(예를 들면 Lucene ê°™ì�€ ìž�바로 ë§Œë“ ì˜¤í”ˆì†ŒìŠ¤ 검색 엔진..). 특히 Eclipse ë�¼ëŠ” ê°•ë ¥í•œ 개발 환경ì�´ 있어서 Visual Studio 보다 ë�” 개발ì�´ ìˆ˜ì›”í• ì •ë�„..
- ë‚´ê°€ 아무리 ì�´ë ‡ê²Œ ë§�í•´ë�„ ê·€ì—� 안들어 올거ë�¼ê³ ìƒ�ê°�ì�€ í•˜ê³ .. 다만 한번 경험ì�„ 해보길 바래. ë‚´ê°€ 지금 와서 조금 후회ë�˜ëŠ”ê²ƒì�€ 위키를 Jsp,Java 로 ì•ˆì§œê³ PHP로 ì§ ê²ƒì�´ë‹ˆ ë§Œí�¼.. ê·¸ë¦¬ê³ ì»´ê³µì—�서 ì œì�¼ 중요한 것ì�€ íŠ¹ì •í•œ 언어 하나를 잘하는 것ë�„ 좋긴 한ë�°, 나는 ì–´ë– í•œ 것ì�´ 눈앞ì—� 와ë�„ 금방 ì �ì�‘í•˜ê³ ë°°ì›Œì„œ ì�¨ë¨¹ì�„수 있는 ëŠ¥ë ¥ë�„ ì¤‘ìš”í•˜ë‹¤ê³ ìƒ�ê°�í•´. ê·¸ë¦¬ê³ ê²€ìƒ‰ 엔진ì—� 관심ì�´ 있다면 오픈소스 검색엔진ì�¸ Lucene ì�„ 한번 ê°–ê³ ë†€ì•„ë´�. ê·¸ë¦¬ê³ ì‹¤ì œë¡œ 간단한 것ì�„ ì§œë³´ê³ ì‹¶ìœ¼ë©´ MemeHarvester ì�´ 프로ì �트 ì�´ì–´ì„œ í•´ë�„ ë�˜ê³ . - namsang
- ë‚´ê°€ 아무리 ì�´ë ‡ê²Œ ë§�í•´ë�„ ê·€ì—� 안들어 올거ë�¼ê³ ìƒ�ê°�ì�€ í•˜ê³ .. 다만 한번 경험ì�„ 해보길 바래. ë‚´ê°€ 지금 와서 조금 후회ë�˜ëŠ”ê²ƒì�€ 위키를 Jsp,Java 로 ì•ˆì§œê³ PHP로 ì§ ê²ƒì�´ë‹ˆ ë§Œí�¼.. ê·¸ë¦¬ê³ ì»´ê³µì—�서 ì œì�¼ 중요한 것ì�€ íŠ¹ì •í•œ 언어 하나를 잘하는 것ë�„ 좋긴 한ë�°, 나는 ì–´ë– í•œ 것ì�´ 눈앞ì—� 와ë�„ 금방 ì �ì�‘í•˜ê³ ë°°ì›Œì„œ ì�¨ë¨¹ì�„수 있는 ëŠ¥ë ¥ë�„ ì¤‘ìš”í•˜ë‹¤ê³ ìƒ�ê°�í•´. ê·¸ë¦¬ê³ ê²€ìƒ‰ 엔진ì—� 관심ì�´ 있다면 오픈소스 검색엔진ì�¸ Lucene ì�„ 한번 ê°–ê³ ë†€ì•„ë´�. ê·¸ë¦¬ê³ ì‹¤ì œë¡œ 간단한 것ì�„ ì§œë³´ê³ ì‹¶ìœ¼ë©´ MemeHarvester ì�´ 프로ì �트 ì�´ì–´ì„œ í•´ë�„ ë�˜ê³ . - namsang










