通过perl和Java之间的套接字发送字节数组

时间:2010-12-06 11:57:05

标签: java arrays perl client

我的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,在线程中   我发送一个字节数组 - &gt;

static DataOutputStream os;

...

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

 }

- &GT;

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

谢谢,

2 个答案:

答案 0 :(得分:4)

您的Perl代码正在执行<$n>,因此它逐行获取数据。因为10是换行字符,接收{10,4}序列意味着它得到一个空行(它打印回来)然后是一个字符4.即使它收到它(Perl代码中的一些调试消息会有帮助) ),如果套接字是块缓冲的(可能是默认的)而不刷新套接字文件句柄,则可能无法完成对套接字的打印。

答案 1 :(得分:1)

您可能需要显式地使用read(而不是readline隐式地使用,顾名思义读取到行尾或EOF)从套接字读取。