HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0207
hnakaiHSPでComet通信3未解決


hnakai

リンク

2013/2/7(Thu) 00:40:05|NO.52220

現在HSPでComet通信を使ったチャットのクライアントを作ろうとしています。
しかし、
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
読みづらい文章/スクリプトで申し訳ありません。



この記事に返信する


OK

リンク

2013/2/9(Sat) 00:07:03|NO.52253

まゆつばですが…
Cometは、Ajaxが利用するのと同 じXmlHttpRequestを利用します、サーバ側でクライアントからのリクエストに対してすぐに応答しないで、データが更新されるま で保留 状態になります、サーバ上でのイベント(チャットで誰かが発言したな ど)が発生すると即座にクライアントに 送信しま す。これにより無駄な負担を抑えられますので、もしかすると正常な可能性があります。



hnakai

リンク

2013/2/10(Sun) 01:06:05|NO.52273

とりあえずBの解決策にするべきでしょうかね...

こんなイメージで大丈夫でしょうか。

          ↓←←←←←←←←←←←←←←←←←←←←←←←←
本体プログラム   ↓                       ↑
          →リクエスト→UI処理とかに専念→来たデータを処理↑
              ↓              ↑
Comet通信専用プログラム  netexec処理---------------終了→本体に通知
              ↓           ↑
Cometサーバ        保留→→→→→→→なにかアクションがあった



OK

リンク

2013/2/10(Sun) 12:50:57|NO.52279

A案だとJavascriptだけで完結できてしまう可能性。
B案だとComet通信専用プログラムをHSPで組んだ場合おそらくjavascriptの様に動作にできなかった場合(HSPでの非同期処理、ここの事はわかりません)同じ現象がでてくる可能性。

本体プログラム(ブラウザ?)※リクエストは一度だけ
↓ ↑
Comet通信専用プログラム
↓ ↑
Cometサーバ ↑
→→→→→→→※接続のまま



ONION software Copyright 1997-2023(c) All rights reserved.