Subscribe to RSS Feed ログイン

オーガニック・ウェルス

Saturday
2018年4月21日

HTML5 WebSocketのハンドシェイクJavaサンプル

http://dev.ariel-networks.com/Members/inoue/websocket

上記の仕様を参考にJavaでハンドシェイクするソースを書いてみました。

long key1_num = chooseNum(key1);
long key2_num = chooseNum(key2);
int key1_s = chooseSpace(key1);
int key2_s = chooseSpace(key2);
long key1_w = key1_num / key1_s;
long key2_w = key2_num / key2_s;
byte[] key_head = bigendiean(key1_w, key2_w);
byte[] byte_keys = new byte[16];
System.arraycopy(key_head, 0, byte_keys, 0, 8);
System.arraycopy(body_code, 0, byte_keys, 8, 8);

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(byte_keys);
byte[] hash = md.digest();
public long chooseNum(String str) {
	String code = "";
	for(int i = 0;i < str.length();i++) {
		try {
			int num  = Integer.parseInt("" + str.charAt(i));
			code += num;
		} catch(Exception e) {}
	}
	long ret = 0;
	try {
		ret = Long.parseLong(code);
	} catch(Exception e) {}
	return ret;
}
public int chooseSpace(String str) {
	int ret = 0;
	for(int i =0;i < str.length();i++) {
		if(str.charAt(i) == ' ') {
			ret++;
		}
	}
	return ret;
}
public byte[] bigendiean(long key1_w, long key2_w) {
	long lon1 = key1_w;
	long lon2 = key2_w;
	byte[] bytes = new byte[8];
	int[] ints = new int[8];
	ints[3] = (int)(lon1 % 256);
	lon1 /= 256;
	ints[2] = (int)(lon1 % 256);
	lon1 /= 256;
	ints[1] = (int)(lon1 % 256);
	lon1 /= 256;
	ints[0] = (int)lon1;

	ints[7] = (int)(lon2 % 256);
	lon2 /= 256;
	ints[6] = (int)(lon2 % 256);
	lon2 /= 256;
	ints[5] = (int)(lon2 % 256);
	lon2 /= 256;
	ints[4] = (int)lon2;

	for(int i = 0;i < 8;i++) {
		bytes[i] = (byte)ints[i];
	}
	return bytes;
}

key1,key2 はHTTPヘッダのSec-WebSocket-Key1、Sec-WebSocket-Key2の値です。まずこの二つのあたいから数字の部分だけを抜き出します。次にkey1,key2からスペースの数を数えます。それぞれを除算し結果二つをビッグエンディアンのバイト値として連結します。body_codeはGETメソッドのPOSTされたデータ部でこれも連結します。結果16バイトからmd5のハッシュを取ったものをレスポンスのボディとして送信すればハンドシェイク終了です。以降TCP通信のように送受信が可能ですが、先頭に0x00,末尾に0xffがテキスト時には付加する必要があります。

コメント(0)続きを読む