【问题标题】:How can i know what l am reading with Java Sockets?我怎么知道我在用 Java Sockets 读什么?
【发布时间】:2017-04-25 10:34:36
【问题描述】:

我正在创建一个 Java 应用程序,它需要客户端与其他客户端进行通信(发送和接收数据)。 我制作了一个简单的服务器应用程序,以使客户端通信更容易。 为了进行通信,服务器和客户端使用我创建的名为“请求”的类。首先,我在想一个简单的 ObjectOutputStream/InputStream 将能够发送/接收我的请求对象,它就是!但我改变了我的计划: 现在,我将我的请求对象序列化为字节数组,并使用 Cipher 对其进行加密。我已经做了解密和反序列化方法,但我不知道如何读取与请求对应的字节数组。搜索后,我发现要知道我必须读取多少字节,我必须发送一个带有字节数组长度的 int。我还发现存在 ByteArrayOutputStream/InputStream,它适合我吗?以及如何读/写一个字节数组的整体? 谢谢!祝你有美好的一天!

【问题讨论】:

  • 所以你破坏了你的设计。所以不要那样做。
  • @EJP 你是什么意思?我只是为我的数据添加加密,为了加密它,我必须将它作为一个字节数组。

标签: java sockets stream


【解决方案1】:

在发送端,先写入字节数组的长度,再写入实际的字节数组:

OutputStream os = ...;
byte[] data = ...;
int dataLength = data.length;
os.write(dataLength >> 24);
os.write(dataLength >> 16);
os.write(dataLength >> 8);
os.write(dataLength);
os.write(data);

在接收端,读取前四个字节,重构数据长度,然后从输入流中读取适当数量的字节:

InputStream is = ...;
byte[] buf = new byte[4];
is.read(buf);
int dataLength = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
// read rest of data according to dataLength

注意: 上面的代码 sn-ps 不包括必要的健全性检查!

【讨论】:

  • 谢谢!完美运行:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多