Отправить байтовый массив через сокет между Perl и Java - PullRequest
0 голосов
/ 06 декабря 2010

У меня большая проблема с моим клиентом java.

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

$ n - сокет

    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 $_;
 }

В режиме 'talk' сервер отправляет клиенту сообщение обратно клиенту

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

static DataOutputStream os;

...

     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);
Я получаю в методе run () только первый байт в массиве (10)

    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:)

Спасибо,

Ответы [ 2 ]

4 голосов
/ 06 декабря 2010

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

1 голос
/ 06 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...