あまりHSPSOCKについての情報がないのは、中々使い勝手が難しい点があるようですが、
テストとして、サーバーとクライアントがリアルタイムにデータを送受信するコードを作ってみました。
①ただし、TCP/IPの知識が適当なので、コードは正しくないかもしれません。
②質問:ソケットとポート番号はワンセットで、HSPSOCKでは32個のソケットが作成できる(32人接続が限界)という理解でよいのか
③質問:サーバー側とクライアント側のソケット番号というのは一致させる?別々でも構わない?
④接続する人数が10人なら、10個のポートを用意していますが、そういう考え方でよいのか。
⑤テストはローカルエリアでしかできていませんが、このコードで、サーバーのポート開放したら動くのか
⑥リアルタイムゲームを想定していますが、このようなコードでよいのか
⑦受信・送信エラー処理等の注意点があればご教示ください。
あまりネット対戦モノをHSPで見かけませんが、やっぱりゲームに限らず、他人と繋がるアプリ作成がしてみたいなぁということからの質問です。
よろしくお願いいたします。長々と失礼します。
サーバー側
#include "hspsock.as" //サーバーの起動 port=10000 //今回はport 10000~10031を使用 ipget title "アドレス"+refstr+" ポート"+port+"で接続を待っています..." sockmake 0,port if stat : dialog "Socket error": goto *errbye //変数初期化 state=0 //待ち受け状態 s_id=1 //準備ソケットの番号 dim socklist,32 //ソケットの状態管理 ;======================================================== ;メインループ *main redraw 0 color 125,0,0 boxf ;======================================================== if state=0{//最初の接続待ち sockwait 0 if stat>1 : dialog "server0:Socket error": goto *errbye if stat=0 {//Clientからの接続要求が成功 sockput ""+s_id,0//Clientへ空いているソケット番号を通知 sockclose 0//最初の接続待ち完了 sockmake s_id,port+s_id//通知したソケット番号と新しいポート番号でソケット作成 state=1//次のステップへ } } ;======================================================== if state=1{//割当てたソケットの接続待ち sockwait s_id title "CHK="+stat+"/"+a if stat>1 : dialog "server1:Socket error": goto *errbye if stat=0 {//割り当てたソケットでの接続に成功 sockput "接続完了"+s_id+":",s_id title "割当ソケットの接続待ち完了"+s_id socklist(s_id)=1//接続完了したソケットを記録 s_id++//次の空き番号を準備 sockmake 0,port//再びソケット0で接続を待つ state=0//前のステップへ } } ;===================== ;全ソケットのうち、接続が完了したソケットから受信 ;全ソケットのうち、接続が完了したソケットへ送信 repeat 32 if cnt>0{ if socklist(cnt)=1{ ;受信 sockcheck cnt if stat=0{ data="" sockget data,64,cnt color 0,0,0 pos 300,cnt*20 mes ""+data } if stat { pos 300,cnt*20 mes ""+cnt+"番=client:socket error:"+stat } ;送信 servertxt="Serverから"+cnt+"番へ送信"+timer sockput servertxt,cnt timer++ } } loop ;======================================================== ;ここにゲーム等の処理を記述 redraw 1 await 1000/60 goto *main ;===================== ;エラー等終了処理 *errbye sockclose mes "終了" stop
クライアント側
#include "hspsock.as" //変数初期化 adr="192.168.0.4" //→サーバーのアドレス:自分の環境に合わせて変更 port=10000 //今回はport 10000~10031を使用 ipget ipaddress=refstr state=0 //サーバーへの接続状態 ;======================================================== ;メインループ *main redraw 0 color 255,255,255 boxf ;======================================================== if state=0{//まずソケット0でサーバーの指定ポートに接続要求 title adr+"、ポート"+port+"に接続中..." sockopen 0,adr,port if stat {//接続できなかった title "サーバーに接続できません:socket error"+stat count++ pos 0,0 color 0,0,0 mes "接続を試行中"+count+"回目" }else{//接続できた data="" count=0 state=1//次のステップへ } } ;======================================================== if state=1{//0番に接続できたので、サーバーから割り当てられた番号を取得 sockcheck 0 if stat=0{//番号を取得 ;サーバーから受信 sockget data,64,0 int_data=int(data) sockopen int_data,adr,port+int_data//そのソケット番号で接続 if stat {//接続できなかった title "ソケット番号"+int_data+"でサーバーに接続できません:socket error:"+stat count++ pos 0,0 color 0,0,0 mes "接続を試行中"+count+"回目" }else{//接続できた title "Server"+adr+"、ポート"+(port+int_data)+"に接続完了" state=2//次のステップへ } } if stat :pos 0,0: mes "sockget_error"+stat } ;======================================================== if state=2{//割り当てられたソケットでサーバーとデータの送受信 ;サーバーから受信 sockcheck int_data if stat=0{ sockget data,64,int_data pos 0,30 color 0,0,0 mes "受信:"+data } ;サーバーへ送信 sockput ""+int_data+"番Clientから受信:"+timer,int_data timer++ } ;======================================================== ;ここにゲーム等の処理を記述 pos 0,50 color 0,0,0 mes "ClientのIPアドレス"+ipaddress redraw 1 await 1000/60 goto *main ;===================== ;エラー等終了処理 *bye sockclose ;ソケットを閉じる redraw 1 await 1000/60 stop