SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2018.07<<12345678910111213141516171819202122232425262728293031>>2018.09
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

前回の記事に引き続き、今度はWinsockを扱うためのJavaScript用クラス。だが、未テスト(^^; おまけにWinsockのOCXは別途必要(^^;;
var __winsock_instances = []; // インスタンスリスト
var __winsock_script; // GetData,PeekDataのスクリプトコントロール用

function Winsock()
{
var is_first = __winsock_instances.length == 0; // 初回のインスタンス作成かどうか

// GetDataメソッドをJScriptから呼ぶためのスクリプトの作成
if( is_first )
{
__winsock_script = WScript.CreateObject("ScriptControl");
__winsock_script.Language = "VBScript";
__winsock_script.AddObject("WScript", WScript);
__winsock_script.AddCode('Function GetData(wsock): Dim brcv: wsock.GetData brcv, vbstring: GetData = brcv: End Function');
__winsock_script.AddCode('Function PeekData(wsock): Dim becv: wsock.PeekData brcv, vbstring: PeekData = brcv: End Function');
}

// Window Socket コントロールの作成
this._object = WScript.CreateObject("MSWinsock.Winsock", "__winsock_");

// プロパティ
this.bytes = 0; // 受信バイト数
this.local = new WinsockHost(); // ローカルのホスト情報
this.remote = new WinsockHost(); // リモートのホスト情報
this.protocol; // プロトコル
this.state; // ソケットの状態(文字列)
this.status; // ソケットの状態(数値)
this._update(); // プロパティを更新

// インスタンスリストへの追加
this.index = __winsock_instances.length; // インスタンスリストのインデックス
__winsock_instances.push( this );
}
function WinsockHost()
{
this.hostname; // ホスト名
this.ip; // IPアドレス
this.port; // ポート番号
}

Winsock.prototype = {
// メソッド
accept: function(id) { this._object.Accept(id); this._update(); },
close: function() { this._object.Close(); this._update(); },
listen: function() { this._object.Listen(); this._update(); },
send: function(data) { this._object.SendData(data); this._update(); },
recv: function() { return __winsock_script.Run("GetData", this._object); this._update(); },
peek: function() { return __winsock_script.Run("PeekData", this._object); this._update(); },
bind: function(port,ip,prot) {
if( prot && prot.match(/^(tcp|udp)$/i) ) this._object.Protocol = prot.match(/tcp/) ? 0 : 1;
this._object.Bind(port,ip);
this._update();
},
connect: function(port,ip,prot) {
if( prot && prot.match(/^(tcp|udp)$/i) ) this._object.Protocol = prot.match(/tcp/) ? 0 : 1;
this._object.Connect(ip,port);
this._update();
},

// イベント(null)
onclose: null,
onconnect: null,
onrequest: null,
onreceive: null,
onerror: null,
onsent: null,
onsending: null,
onstatechange: null,

// 内部使用
_update: function() { // プロパティの更新
this.bytes = this._object.bytesReceived;

this.local.hostname = this._object.LocalHostName;
this.local.ip = this._object.LocalIP;
this.local.port = this._object.LocalPort;

this.remote.hostname = this._object.RemoteHost;
this.remote.ip = this._object.RemoteHostIP;
this.remote.port = this._object.RemotePort;

var prev_status = this.status;
switch( this.status = this._object.State )
{
case 0: this.state = "Closed"; break; // (既定値) 閉じています。
case 1: this.state = "Open"; break; // 開いています。
case 2: this.state = "Listening"; break; // 接続要求を待っています。
case 3: this.state = "ConnectionPending"; break; // 接続がペンディング状態になっています。
case 4: this.state = "ResolvingHost"; break; // ホストの解決処理中です。
case 5: this.state = "HostResolved"; break; // ホストの解決が完了しました。
case 6: this.state = "Connecting"; break; // 接続処理中です。
case 7: this.state = "Connected"; break; // 接続が完了しました。
case 8: this.state = "Closing"; break; // 相手側のマシンが接続を閉じようとしています。
case 9: this.state = "Error"; break; // エラー。
default:this.state = "Unknown"; break; // その他
}

this.protocol = this._object.Protocol == 0 ? "TCP" : "UDP";

// 状態変化イベント処理
if( prev_status!=this.status && this.onstatechange ) this.onstatechange();
}
};

function __winsock_Close() { __winsock_callback(this,"onclose"); }
function __winsock_Connect() { __winsock_callback(this,"onconnect"); }
function __winsock_ConnectionRequest(id) { __winsock_callback(this,"onrequest",id); }
function __winsock_DataArrival(bytes) { __winsock_callback(this,"onreceive",bytes); }
function __winsock_Error(n,d,s,h,x,c) { __winsock_callback(this,"onerror",n,d,s); }
function __winsock_SendComplete() { __winsock_callback(this,"onsent"); }
function __winsock_SendProgress(b1,b2) { __winsock_callback(this,"onsending",b1,b2); }

///////////////////////////////////////
// 内部使用
function __winsock_callback(obj,method)
{
for(var i=0;i<__winsock_instances.length;i++)
if( __winsock_instances[i]._object==obj )
{
var ws = __winsock_instances[i];
ws._update();
if( ws[method] )
{
var args = new Array();
for(var n=2;n<arguments.length;n++) args.push(arguments[n]);
ws[method].apply(ws,args);
}
return;
}
}


テーマ:JavaScript(ジャバスクリプト) - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。