【问题标题】:receive wrong bytes values over socket stream in java [closed]在java中通过套接字流接收错误的字节值[关闭]
【发布时间】:2011-10-17 17:27:09
【问题描述】:

我尝试将文件作为字节数组读取并通过套接字连接通过网络发送, 我在从文件读取后(在发送之前)打印了字节的值,并在从套接字接收到它之后打印了字节的值......这是不同的!收到错误的值我不知道为什么

发送前的样本字节: 21, 0, 52, 0 接收后的样本字节: -8, -1, -4, -1

我使用 write(byte[] b); 发送了字节OutputStream 类的 并使用 read(byte[] b, int off, int len) 接收字节; InputStream 类的。

谁能帮帮我?

【问题讨论】:

  • Voo 对缺乏信息表示失望。如果他们看到了您的源代码,您可能会犯下某人可能会立即认出的错误。您是否尝试读取超过 4 个字节?我怀疑您阅读的内容与您所写的内容无关-完全是另一回事-但我也不知道它是什么。
  • 正如 voo 和 ed 所说,我们需要做的远不止这些。创建一个能重现问题的最小的测试程序,然后发布它。我刚刚制作了一个快速测试程序,它使用相同的方法发送和接收这些字节,并且运行良好。
  • 这种网络连接是否发生在不同的操作系统之间?这可能是字节序问题吗?
  • 你没有做你认为你正在做的事情。字节不可能改变你建议的方式,值没有符号,字节序在这里无关紧要

标签: java sockets stream bytearray byte


【解决方案1】:

你可以试试

ServerSocket ss = new ServerSocket(0);
Socket c = new Socket("localhost", ss.getLocalPort());

byte[] bytes = {21, 0, 52, 0};
c.getOutputStream().write(bytes);
c.close();

byte[] bytes2 = new byte[4];
Socket s = ss.accept();
ss.close();

new DataInputStream(s.getInputStream()).readFully(bytes2);
System.out.println(Arrays.toString(bytes2));
s.close();

打印

[21, 0, 52, 0]

【讨论】:

  • 有趣!如果不阅读 javadocs,我会假设您的代码会在 c = new Socket(...) 等待其后的 s = ss.accept() 时死锁。我猜它没有:-)
  • @Adrian Pronk 不,这都是异步的。您可以将所有客户端代码移动到accept() 之前并包括c.close(),它仍然可以工作。
  • @EJP,我假设你必须在 s = ss.accept(); 之前 s.getInputStream() ;)
  • @Peter Lawrey 当然,否则没有s,但那是服务器端代码。所有涉及 'c' 的东西都可以在接受之前进行。
  • @EJP,我已经更改了示例以演示异步性质。
【解决方案2】:

注意将字节和字符视为可互换的。字节已签名!

【讨论】:

  • 我想到了这个,但这显然不是(唯一的)问题。首先,零是零,无论是否有符号。其次,我写出了这些位并且没有看到模式(超出~0 = -1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多