- PR -

PerlとJavaではSocketの受信の振る舞いが違う?

1
投稿者投稿内容
葉月要
会議室デビュー日: 2006/06/02
投稿数: 11
投稿日時: 2006-06-02 11:12
お世話になります

現在 Windows Media Encoder データを受信し、そのままリレーする
リレープログラムを作成してみようと思い、試行錯誤しているのですが、
JavaとPerlで同じようなプログラムを組んだとき、socketの受信データが同じにならず
四苦八苦しております
----------------------------------

追記します
WMEのデータセットは
$D|サイズ|データ・・・・・
という形になっているようですが、Perlで受信するとこのサイズが1451もしくは1452と
規則正しく受信されます(パケットサイズが固定?)
しかし、おなじWMEに java でアクセスすると
このサイズが変動してしまいます。まずココから問題のようですorz

------------------------------
プログラム
-------------------------------------
masterはSocketChannelです
-------------------------------------
ByteBuffer head=ByteBuffer.allocate(2);
master.read(head);
head.flip();

//先頭2バイト取得する(データヘッダーのチェック用)
byte[] head_bin = head.array();
String str = new String(charset.decode(head));

if(str.equals("\\n") || str.equals("\\r\\n")){
continue;
}
//さらに2バイト取得する(データサイズチェック)
ByteBuffer size_bb =ByteBuffer.allocate(2);
master.read(size_bb);
size_bb.flip();

if ( head_bin[0]!=0x24 && !str.endWith("D")){
continue;
}
if ( str.equals("$E")){
continue;
}

//データサイズの取得

byte[] size_bin = size_bb.array();
Byte fst= new Byte(size_bin[0]);
Byte snd= new Byte(size_bin[1]);
int size = snd.intValue()&0xFF;
size = size<<8;
size+=fst.intValue()&0xFF;

//データサイズ分のバイト領域を確保して
//ソケットから受信
ByteBuffer data= ByteBuffer.allocate(size);
master.read(data);
data.flip();
-------------------------------------
perl
-------------------------------------
read($socketdata, $head_bin, 2);
read($socketdata, $size_bin, 2);

if (ord($head_bin) != 0x24 && $head_bin ne '?D') {
return;
}
if ($head_bin eq '$E') {

}
my $size = unpack("S2", $size_bin);
read($socketdata, $data, $size);
-------------------------------------

このようなものを走らせた場合、
Perlでは データヘッダ $D 受信データサイズ 1451 or 1452 のデータが
ほぼ永久に連続してくるのに対し、
javaでは
D 1451
$i 51362
$D 1451
$!) 49188
$D 1451
$ 39241
$D 1451
$D 1451
$h 45643
$D 1451
$!) 35128
$D 1451
$P 2309
$D 1451

と、ごみ?のようなデータが入ってしまいます。
なぜだか分かる方、いらっしゃいますでしょうか?
ネットワークプログラミングは初めてのため、
コネクションの張り方がまずいとか、根本的なことを間違っているような気がしますが、
ご指導の程、お願い致します

[ メッセージ編集済み 編集者: 葉月要 編集日時 2006-06-02 11:14 ]

[ メッセージ編集済み 編集者: 葉月要 編集日時 2006-06-02 16:19 ]
1

スキルアップ/キャリアアップ(JOB@IT)