我的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:)
谢谢,
答案 0 :(得分:4)
您的Perl代码正在执行<$n>
,因此它逐行获取数据。因为10是换行字符,接收{10,4}
序列意味着它得到一个空行(它打印回来)然后是一个字符4.即使它收到它(Perl代码中的一些调试消息会有帮助) ),如果套接字是块缓冲的(可能是默认的)而不刷新套接字文件句柄,则可能无法完成对套接字的打印。
答案 1 :(得分:1)
您可能需要显式地使用read
(而不是readline
隐式地使用,顾名思义读取到行尾或EOF)从套接字读取。