[HSP3]hspsockでHTTPサーバを作る

本当にHTTPサーバを作りたいならば、JavaServletをお勧めします。

作り方はとっても簡単、仕様通りの要求を受けて、仕様通りの応答をするだけです。
hspsockならTCP辺りは全部やってくれるので、仕様見ながら応答プログラムを設計するだけ。
HTTPメッセージの解説はとほほのWWW入門がお勧めです。

動作はHSPを実行させ、適当なウェブブラウザから「http://localhost:20111」へジャンプすれば確認できます。localhostは自分のPCを示す、コロンはポート番号。ポート解放さえすれば、他PCからアクセス可能でしょう。多分。
適当なディレクトリを参照しようとすると無地の404を返します。そういうプログラムを記述しました。

logmesを多用しています。「メニューバー→HSP→Debugウィンドゥを表示」で有効にすると、プログラム実行時、デバッグウィンドウを表示できます。


#include "hspsock.as"

#const TCPPORT 20111

txresponse=""

sdim buff,5000 : buffsize=0
;rev_type="","",""
;rev_connect=""
;rev_accept=""
;rev_agent=""
;rev_encode=""
;rev_lang=""
;rev_ref=""
;rev_data=""

// 初期化
sockmake 0,TCPPORT
if stat : dialog "sockmake error"+stat : end
onexit *exit

mes "make:"

flreset=0
repeat
// Listen.
sockwait 0,0
title ""+stat

if (stat==0) {
flreset=0
logmes "[sockwait]:0"

// 取得待ち
sockcheck 0
if stat : mes "sockcheck break:"+stat : continue

// 読み取り
sockget buff,5000,0
mes "[sockget]:"+stat
buffsize=stat

// debugウィンドウに表示
logmes "[sockget]"
logmes ""+buff

// 解析
gosub *bufana

// URL整形
url=""
getstr url,rev_type.1,0,'?'
url=getpath(url,16)

// 返信
if (url=="/"){
txresponse="<head><body><h2>index</h2><a href=\"time\">time</a>,<a href=\"info\">info</a>,<a href=\"form\">form</a></body></html>"
txresponse=strf("HTTP/1.1 200 OK\nContent-Length: %d\nContent-Type: text/html\n\n",strlen(txresponse))+txresponse
sockput txresponse,0
}else:if (url=="/time"){
txresponse=strf("<head><body><h2>%02d:%02d:%02d</h2></body></html>",gettime(4),gettime(5),gettime(6))
txresponse=strf("HTTP/1.1 200 OK\nContent-Length: %d\nContent-Type: text/html\n\n",strlen(txresponse))+txresponse
sockput txresponse,0
}else:if (url=="/info"){
txresponse =strf("<head><body><table border=1><tr><td>type</td><td>%s</td></tr><tr><td>referer</td><td>%s</td></tr><tr><td>user_agent</td><td>%s</td></tr>",rev_type.0,rev_ref,rev_agent)
txresponse+=strf("<tr><td>data</td><td>%s</td></tr></table><textarea rows=12 cols=60>%s</textarea></body></html>",rev_data,buff)
txresponse=strf("HTTP/1.1 200 OK\nContent-Length: %d\nContent-Type: text/html\n\n",strlen(txresponse))+txresponse
sockput txresponse,0
}else:if (url=="/form"){
txresponse ="<head><body><form method=\"POST\" action=\"info\">1<input type=\"text\" name=\"key1\">2<input type=\"text\" name=\"key2\">"
txresponse+="<input type=\"submit\"></form></body></html>"
txresponse=strf("HTTP/1.1 200 OK\nContent-Length: %d\nContent-Type: text/html\n\n",strlen(txresponse))+txresponse
sockput txresponse,0
}else{
sockput "HTTP/1.1 404 Not Found\nConnection: close\nContent-Type: text/html\n\n",0
}
logmes "[sockput]"+stat

}else:if (stat>1){
mes "[sockwait]ERROR:"+stat
//break
if (flreset>2) : mes "ERROR." : goto *exit
flreset++
// リセット
sockclose 0
sockmake 0,TCPPORT
if stat : dialog "sockmake error"+stat : goto *exit
mes "make:"+stat
}else{
flreset=0
}
wait 15

// tabキーを押すと画面リセット
stick key
if key&1024 : cls
loop
*exit
sockclose 0
mes "sockclosed"
onexit 0
stop

// 受信情報解析
*bufana
// 他にも種類は山ほどある
rev_type="","","" // GET ADDR HTTP
rev_connect="" // Connection:
rev_accept="" // Accept:
rev_agent="" // User-Agent:
rev_encode="" // Accept-Encoding:
rev_lang="" // Accept-Language;
rev_ref="" // Referer:
rev_data="" // data

notesel buff
noteget a,0
split a," ",rev_type // 始めの1行

repeat notemax-2,1
noteget a,cnt
getstr b,a,0,':'
i=strsize
b=getpath(b,16)
switch b // 小文字化して比較
case "host"
swbreak
case "connection"
rev_connect=strmid(a,i,1024)
swbreak
case "accept"
rev_accept=strmid(a,i,1024)
swbreak
case "user-agent"
rev_agent=strmid(a,i,1024)
swbreak
case "accept-encoding"
rev_encode=strmid(a,i,1024)
swbreak
case "accept-language"
rev_lang=strmid(a,i,1024)
swbreak
case "referer"
rev_ref=strmid(a,i,1024)
swbreak
default
logmes "? ->"+a
swbreak
swend
loop

// postメッセージなど
noteget a,notemax-1
rev_data=a

noteunsel

return


やっていることは、ウェブブラウザからの要求が届き、sockget命令によって変数buffに突っ込まれるので解析、応答メッセージを作成してsockputするだけです。
自分で作る上で引っかかったのはsockwaitは接続要求を待つのであって、データが届いたとは限らないんですなぁ。sockcheckを挟まないと長時間応答なしになります。HSPのサーバサンプルにはsockcheck入ってなかったんですよお!

是非HSP愛に溢れる方はHSPでHTTPサーバ構築なんてどうでしょう。

2015/04/26 修正
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : HSP3 通信制御

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++JavaRubyUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1437位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
245位
アクセスランキングを見る>>