しかし、
1.hspinetでnetload
2.hspinetでnetrequest_get→netexec
3.hspsockでHTTP通信
のいずれの方法を試しても、
netload,netexec,sockgetの部分で
サーバ側からデータが送信されるまで(チャットに入退室や投稿などの動きがあるまで)の
数十秒間(0<=x<=30秒)、プログラムの応答がなくなってしまいます。(スクリプトも止まってしまう)
これに対する解決策はいずれが最適でしょうか?それともほかに解決策はあるのでしょうか?
A.JavascriptでComet通信をしてそれをHSP側で傍受(?)する
B.メインプログラムとは別にComet通信用のプログラムを用意し、呼び出す
以下はnetrequest_get→netexecの方法を使った例です。
(「かにチャット」(http://www.kanichat.com/)の
サンプルチャット(http://chat.kanichat.com/chat?roomid=sample6)
を利用しています。)
*comp3のjsonclose命令までで、Comet通信をするための準備をしています。
そしてその直後のneturl命令から後が、本題のComet通信を行っている部分です。
読みづらい文章/スクリプトで申し訳ありません。
//unixtime関数は //「UNIX時間 1234567890」(http://d.hatena.ne.jp/As_hsp/20090206/1233929856)より #uselib "crtdll.dll" #func unixtime "time" sptr #include "hspinet.as" #const NULL 0 font "",12 roomid="sample6" netinit if stat : dialog "ネット接続できません。" : end neturl "http://chat.kanichat.com/" mes "chat?roomid="+roomid netrequest_get "chat?roomid="+roomid *loop1 netexec res if res > 0 : goto *comp1 if res < 0 : goto *bad1 await 50 goto *loop1 *bad1 neterror estr mes "ERROR "+estr stop *comp1 //HTMLを解析してサーバ名を取得 netgetv buf nkfcnv buf2,buf serveridb=instr(buf2,0,"<frame src=\"http://")+strlen("<frame src=\"http://") serveride=instr(buf2,0,".comet.kanichat.com") serverid=strmid(buf2,serveridb,serveride-serveridb) mes "serverid="+serverid mesbox buf2,640,50,1 //Comet通信用ID取得 neturl "http://"+serverid+".comet.kanichat.com/rent/" unixtime(varptr(unixtime_tmp)) mes "CometServlet?mode=createNewId&roomid="+roomid+"&_="+unixtime_tmp+"000" netrequest_get "CometServlet?mode=createNewId&roomid="+roomid+"&_="+unixtime_tmp+"000" *loop3 netexec res if res > 0 : goto *comp3 if res < 0 : goto *bad3 await 50 goto *loop3 *bad3 neterror estr mes "ERROR "+estr stop *comp3 netgetv buf nkfcnv buf2,buf mesbox buf2,640,50,1 jsonopen JsonPtr,buf2 jsongetobj InfoPtr,"status",JsonPtr jsongeti st_code,"code",InfoPtr jsongets st_codes,"codeString",InfoPtr if st_code!=2000 : mes"#ERR#"+st_code+":"+st_codes : stop jsongetobj InfoPtr,"session",JsonPtr jsongeti alive,"alive",InfoPtr jsongets id,"id",InfoPtr mes "alive:"+alive mes "id:"+id jsonclose //Comet通信開始 neturl "http://"+serverid+".comet.kanichat.com/rent/" unixtime(varptr(unixtime_tmp)) mes "CometServlet?mode=loggetComet&id="+id+"&roomid="+roomid+"&_="+unixtime_tmp+"000" netrequest_get "CometServlet?mode=loggetComet&id="+id+"&roomid="+roomid+"&_="+unixtime_tmp+"000" *loop5 netexec res /*=======================この命令でしばらく応答がなくなる=========================*/ if res > 0 : goto *comp5 if res < 0 : goto *bad5 await 50 goto *loop5 *bad5 ; エラー neterror estr mes "ERROR "+estr stop *comp5 ; 完了 mes res netgetv buf nkfcnv buf2,buf mesbox buf2,640,50,1 stop