カテゴリー
未分類

JavaScript Object Dumper

JavaScriptのオブジェクトの中身を表示するメソッド。

http://smokycat.info/category_javascript/106 この記事に張り合って書いてみた。

理系の人のコードはやたら短いし、変数名一文字だし、凄いですね。

 

dumpObject(obj)

で戻り値はJSON形式になっています。

※Javaでいうprivateで定義されている変数までは取得できません。

function dumpObject(obj,index,objKey){
    index=index?index:0;index++;
    var returnStr = “”;
    var tab = “”;
    for(i=1;i<index;i++)tab+=”t”;
    returnStr += “n”+tab+(objKey?”””+objKey+””:”:””)+”{“;
    for(key in obj)
        returnStr += typeof obj[key]==”object”?
            dumpObject(obj[key],index,key):
            “n”+tab+”t”+”””+key+””:”+(typeof obj[key]==”string”?”””+obj[key]+”””:obj[key])+”,”;
    return returnStr.substring(0,returnStr.length-1) + “n”+tab+”}”+(!objKey?””:”,”);
}

以下のように使ってみてください。

window.open().document.write(dumpObject(eval(“(“+window.prompt()+”)”)).replace(/n/g,”<br>”).replace(/t/g,”&nbsp;&nbsp;&nbsp;&nbsp;”));

ほとんど必要ないと思いますが、以下のようにしてオブジェクトを復元できます。

eval(“(“+dumpObject(obj)+”)”);

 

Bookmarklet用

(function f(a,b,c){b=b?b:0;b++;var d=””;var e=””;for(i=1;i<b;i++)e+=”t”;d+=”n”+e+(c?”””+c+””:”:””)+”{“;for(k in a)d+=typeof a[k]==”object”?f(a[k],b,k):”n”+e+”t”+”””+k+””:”+(typeof a[k]==”string”?”””+a[k]+”””:a[k])+”,”;return d.substring(0,d.length-1)+”n”+e+”}”+(!c?””:”,”)})(obj)

この無名関数の引数(赤文字部分)にオブジェクトを渡してください。

カテゴリー
未分類

JavaのSocketで切断を検知(2)

以前にはデータ交換用と接続チェック用の2つのソケットをつないで、接続チェック用のソケットを使って相手が一定時間以内にデータを送ってきているかどうかで接続をチェックしていた。

あまりに無駄である。

 

もっと素直に簡単な方法があった。

Socket s = new ServerSocket(portNum).accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
try{
    while(true)System.out.println(in.readLine());
}catch(IOException e){
    System.out.println(“Disconnected.”);
}

これだけ。どうやら切断されたらIOExceptionに投げられるらしい。まぁ当たり前といえば当たり前なのかな?

というのを踏まえて、複数人が同時にアクセス出来るメッセージ交換システムを作ってみた。

 

以下ソースコード

SocketServer.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketServer{
    private static ArrayList<ServerSocketThread> socketThreads = new ArrayList<ServerSocketThread>();
    public static void main(String[] args)throws IOException{
        while(true){
            ServerSocket sv = new ServerSocket(1024);
            ServerSocketThread sst = new ServerSocketThread(sv.accept());
            socketThreads.add(sst);
            sst.start();
            sv.close();
            System.out.println(“Connected!”);
            System.out.println(“now : “+socketThreads.size()+”n”);
            for(int i=0;i<socketThreads.size();i++){
                try{socketThreads.get(i).send(“Connected.”);}catch(IOException ex){}
            }
        }
    }
    public static class ServerSocketThread extends Thread{
        private Socket s;
        private BufferedReader in;
        private PrintWriter out;
        ServerSocketThread(Socket s)throws IOException{
            this.s = s;
            in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            out = new PrintWriter(s.getOutputStream());
        }
        public void run(){
            try{
                while(true){
                    String str = in.readLine();
                    for(int i=0;i<socketThreads.size();i++){
                        socketThreads.get(i).send(str);
                    }
                }
            }catch(IOException e){
                socketThreads.remove(this);
                System.out.println(“Disconnected.”);
                System.out.println(“now : “+socketThreads.size()+”n”);
                for(int i=0;i<socketThreads.size();i++){
                    try{socketThreads.get(i).send(“Disconnected.”);}catch(IOException ex){}
                }
            }
        }
        public void send(String data)throws IOException{
            out.println(data);
            out.flush();
        }
    }
}

 

SocketClient.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketClient{
    private static Socket s;
    public static void main(String[] args)throws IOException{
        Scanner input = new Scanner(System.in);
        s = new Socket(“localhost”,1024);
        PrintWriter out = new PrintWriter(s.getOutputStream());
        new ClientSocketThread().start();
        while(true){
            out.println(input.nextLine());
            out.flush();
        }
    }
    public static class ClientSocketThread extends Thread{
        private BufferedReader in;
        ClientSocketThread()throws IOException{
            in =  new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        public void run(){
            try{
                while(true){
                    System.out.println(in.readLine());
                }
            }catch(IOException e){}
        }
    }
}

 

恐らくJavaプログラム間だけではなく、Java←→Flashでもいけると思います。

また時間があれば検証してみます。

これは面白いものが作れそうな予感。

 

もしこの記事を見た方で、「この人を我社に!」と思えた方がいらっしゃいましたら拾ってください!(切実)