- - PR -
PerlとJavaではSocketの受信の振る舞いが違う?
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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