Skip to content

Instantly share code, notes, and snippets.

@bolero-MURAKAMI
Created January 19, 2012 15:15
Show Gist options
  • Save bolero-MURAKAMI/1640546 to your computer and use it in GitHub Desktop.
Save bolero-MURAKAMI/1640546 to your computer and use it in GitHub Desktop.
Debug.console.visible = true;
Debug.controller.visible = true;
// スクリプトのロード
Scripts.execStorage("ktl/Network.tjs");
// サーバクラス
// 指定ポートを常に監視し、受信したメッセージをコンソールに出力する
class Server {
var sockets = [];
var current;
var port = 0;
function Server(port_) {
port = port_;
current = new Socket();
if (!current.asyncAccept(port)) {
Debug.message("info: Server - 接続待ちの開始に失敗しました");
}
System.addContinuousHandler(onContinuous);
}
function finalize() {
System.removeContinuousHandler(onContinuous);
for (var i = 0, last = sockets.count; i != last; ++i) {
invalidate sockets[i];
}
invalidate current;
}
function onContinuous() {
// 受信のチェック
for (var i = 0, last = sockets.count; i != last; ++i) {
var socket = sockets[i];
if (socket.readingFinished) {
var failed = false;
if (!socket.readingSucceeded) {
Debug.message("info: Server - 受信に失敗しました");
failed = true;
}
if (failed) {
System.removeContinuousHandler(onContinuous);
return;
}
Debug.message("info: Server - 受信に成功しました");
// 受信に成功した場合、改行まで読み込み、受信を再開する
var message = socket.popLine();
if (socket.asyncReadUntil("\r\n") < 0) {
Debug.message("info: Server - 受信の開始に失敗しました");
}
// 受信メッセージ出力
Debug.message("message : " + message);
}
}
// 接続待ちのチェック
if (current.acceptingFinished) {
var failed = false;
if (!current.acceptingSucceeded) {
Debug.message("info: Server - 接続待ちに失敗しました");
failed = true;
} else if (!current.isOpen) {
Debug.message("info: Server - ソケットが開かれていません");
failed = true;
}
if (failed) {
System.removeContinuousHandler(onContinuous);
return;
}
Debug.message("info: Server - 接続待ちに成功しました");
// 接続待ちに成功した場合、受信に移行する
if (current.asyncReadUntil("\r\n") < 0) {
Debug.message("info: Server - 受信の開始に失敗しました");
}
// 接続されたソケットを配列に移して、新たな接続待ちを立てる
sockets.add(current);
current = new Socket();
if (!current.asyncAccept(port)) {
Debug.message("info: Server - 接続待ちの開始に失敗しました");
}
}
}
}
// クライアントクラス
// 指定ポートに接続してメッセージ送信する
class Client {
var socket;
var port;
function Client(port_) {
port = port_;
socket = new Socket();
}
function finalize() {
invalidate socket;
}
function connect() {
// 接続 (ループバックアドレス = 127.0.0.1)
if (!socket.connectLoopback(port)) {
Debug.message("info: Client - 接続に失敗しました");
return;
}
Debug.message("info: Client - 接続に成功しました");
if (!socket.isOpen) {
Debug.message("info: Client - ソケットが開かれていません");
return;
}
}
function send(message) {
socket.pushNarrowString(message + "\r\n");
if (socket.write() < 0) {
Debug.message("info: Client - 送信に失敗しました");
}
}
}
// スレッドプールのスレッド数を 10 に設定
// 非同期処理の並列実行(例えばソケットの接続待ちをしながら既に接続されたソケットの受信を行う)はこの数に制限される
// それ以上の場合は、非同期処理はキューイングされる
Network.runAtLeast(10);
var port = 31400;
var server = new Server(port);
kag.add(server);
var client1 = new Client(port);
var client2 = new Client(port);
kag.add(client1);
kag.add(client2);
// コンソールから以下のようなコードを実行して検証する
//client1.connect();
//client1.send("(1) Hello!");
//client2.connect();
//client2.send("(2) Hello!");
// ※注意
// 仕様上、とても短い(具体的には、accept に成功してから次の accept を開始するまで)以下の間隔に連続して connect 要求が来ると対応できない。
// ContinuousHandler で処理を行なう場合、ContinuousHandler の呼出間隔が処理限界となる。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment