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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0627
SHIMAランキングが作りたい4解決


SHIMA

リンク

2015/6/27(Sat) 11:45:40|NO.69867

hspsockでのランキングの作り方を教えてください。



この記事に返信する


kanamaru

リンク

2015/6/29(Mon) 18:56:40|NO.69886

多分、
http://hsp.tv/play/pforum.php?mode=all&num=69831
を受けてこの質問をしたと思われますが、
責任を取って(hspsockで作れるといったのは僕ですし)、
説明したいと思います。
まず、どういうサーバーを使うか考えます。
考えられるのは、
1.自前ランキングサーバー
2.webサーバー(専用のファイルを配置する。)
です。それぞれに分けて説明します。
1.
 1−1 sockmakeを使ってサーバーを立てる。
     この時、ポートを解放する。
 1−2 hspからsockopenで接続してデータをやり取りして、
     ランキングの参照や更新を行う。
     やり取りに使うヘッダは独自ヘッダ
     参照か更新なのかとデータサイズがわかるものでよい
2.
 2−1 webサーバーに専用のファイルを配置して、
     ランキングを参照したいときは
     sockopen&sockgetで取得して、
     ランキングを更新したいときは
     専用のphpなどを用意し、
     POST形式で送信する。
こちらでもプログラムを作るので頑張ってください。



kanamaru

リンク

2015/6/30(Tue) 08:26:15|NO.69897

とりあえず、簡単にhspsockを使ったデータの参照と取得用モジュールを作ってみました。
実行テスト等を行ってないのでエラーが発生するかもしれませんが
hdlなどを読めばエラーは解決すると思います。
もし解決できなければこのスレッドで連絡をくれれば修正等するつもりです。
また、エラーが解決してもまだこのプログラムは未熟です。
通信途中でデータが改変されてないかのチェックも行ってなければ
やり取りしているデータの暗号化もされていません。
また、keep-aliveしておいてcloseしていません。
というか200かどうかしか調べてない時点でプログラムとしてどうなのかというところもあります。
改善するべきところはまだまだあります。
また、もしそれが解決したとしてもランキングを作れたことのはなりません。
ランキングのデータの形式を決め、
その形式に基づいたデータの解析部分の構築、
まだまだ完成には程遠いです。
頑張ってください。



kanamaru

リンク

2015/6/30(Tue) 08:27:48|NO.69898

ソースを貼るのを忘れてました。
これが先ほど言ったモジュールです。

#module "myranking" #include "hspsock.as" /* rankget ランキングのデータを取得します。 sname サーバー名 ドメイン名、IPアドレス可 path サーバーから見たデータファイルへの相対パス 最初に/を忘れないでください size 最大サイズ */ #defcfunc rankget str sname,str path,int size sockopen 0,sname,80 getip ip=refstr data={" GET "}+path+{" HTTP/1.1 Accept: text/plain Accept-Charset: Shift_JIS Accept-Language: ja,en Allow: GET Cache-Control: no-cache User-Agent: HSP/3.4(Compatible; "}+sysinfo(0)+{") Host: "}+ip+{" connction:keep-alive content-Language: ja,en "} sockput data,0 repeat if stat=0:break if stat=1:mes "タイムアウトしました。":stop if stat=2:mes "サーバーとの通信でエラーが発生しました。":stop await 1 loop sockget result,size,0 if stat!0:mes "サーバーとの通信でエラーが発生しました。":stop split result,"\n",result2 foreach result2 c=cnt if result(0)!"HTTP/1.1 200 OK":mes "サーバーにデータがありません":stop if result(cnt)="":break await 1 loop repeat length(result2)-c if cnt=0{ result3+=result2(c+1) }else{ result3+="\n"+result2(c+cnt+1) } await 1 loop return result3 /* rankput ランキングのデータを更新します sname rankgetと同じ path rankgetと同じ string 新しいデータ。 これはランキングの変わらない部分も合わせたものを指定します。 逆に言うとここに空文字列等を指定すればデータの初期化も可能です。 */ #deffunc rankput sname,str path,str string sockopen 0,sname,80 getip ip=refstr data={" POST "}+path+{" HTTP/1.1 HOST: "}+ip+{" User-Agent: hsp/3.4("}+sysinfo(0)+{") Accept: texi/plain Accept-Language: ja,en Accept-Charset: Shift_JIS Connection: keep-alive Content-type: text/plain Content-Length:"}+strlen(string)+{" "}+string sockput data,0 repeat if stat=0:break if stat=1:mes "タイムアウトしました。":stop if stat=2:mes "サーバーとの通信でエラーが発生しました。":stop await 1 loop sockget result,size,0 if stat!0:mes "サーバーとの通信でエラーが発生しました。":stop split result,"\n",result if result(0)!"HTTP/1.1 200 OK":mes "データの更新に失敗しました。" return
先ほども言ったように未熟なプログラムですが、
参考になれば幸いです。



SHIMA

リンク

2015/7/4(Sat) 17:24:07|NO.69948

ソースをありがとうございます。
これから改良して、今、開発中のプログラムに
対応させたいとおもいます。



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