2010-12-06 3 views
0

У меня большая проблема с моим java-клиентом.Отправить массив байтов через сокет между perl и Java

Сервер: perl, с IO :: Socket;

$ п гнездо

sub listen{  
while(1){ 
    my $n = $_[0]->accept(); 
    my $thread; 
    my $thread2; 
    $thread = threads->create('talk', $n); 
    $thread2 = threads->create('recu', $n); 
} 

Когда клиент посылает сообщение на сервер

sub talk{ 
my $n = $_[0]; 
while(<$n>){ 
    print $n $_; 
} 

В «говорить» сервер отправить сообщение клиента обратно клиенту

Клиент: Java, в потоке Я посылаю массив байтов ->

...

 public static void handleMsg(byte [] b){ 
    try { 
    os.write(b); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

} 

->

<pre><code> 
    byte[] buff = new byte[]{10,4}; 
ThreadListen.handleMsg(buff); 
</code></pre> 
I receive in the run() method only the first byte in the array (10) 
<pre><code> 
    public void run(){ 
    DataInputStream in = null; 
    try{ 
    in = new DataInputStream(s.getInputStream()); 
    } catch (IOException e) { 
    System.out.println("in or out failed"); 
    System.exit(-1); 
    } 

    while(true){ 
    try{ 
    byte[] buff = new byte[6]; 
    int b = in.read(buff, 0, buff.length); 
    }catch (IOException e) { 
    System.out.println("Read failed"); 
    System.exit(-1); 
    } 
    } 
} 

Если я пытаюсь отправить

byte[] buff = new byte[]{50,4}; 
ThreadListen.handleMsg(buff); 

Я не беру ничего !!!

ли я что-то пропустил, я полагаю, что если я посылаю

byte[] buff = new byte[]{50,4}; 

я должен получить 50,4 :)

Спасибо,

ответ

4

Ваш код Perl делает <$n>, поэтому он выводит данные по очереди. поскольку 10 является символом линии, прием последовательности {10,4} означает, что он получает пустую строку (которая возвращается), а затем символ 4. Даже если он получает это (некоторые сообщения отладки в коде Perl помогут), печать возврат к сокету может не завершиться, если сокет заблокирован буфером (вероятно, по умолчанию) без очистки дескриптора файла сокета.

+0

Поймите - почему, когда я отправляю 10,4, я получил 10, но когда я отправляю 50,4, я ничего не получил ... – JohnJohnGa

+0

<$n> выбирает строку за строкой: он ничего не вернет, пока не встретит конечный результат, (10) или сокет закрывается другой стороной. Вам нужно использовать 'read', как упоминалось Hasturkun. – araqnid

+0

Вы имеете в виду что-то вроде этого?: Sub talkRead { my $ n = $ _ [0]; мои данные; \t while (1 == 1) { \t \t $ n-> read ($ data, 1024); \t \t print $ n $ data; \t} } – JohnJohnGa

1

Вы можете использовать read явно (вместо readline неявно, что, как следует из названия, считывает до конца строки или EOF) для чтения из сокета.

Смежные вопросы