java - 使用 TCP 连接获取字节数组

标签 java tcp udp datainputstream

我之前使用 UDP 发送/接收数据,但现在我想切换到 TCP 以避免丢包。

我阅读了一些关于 TCP 的教程并注意到 TCP 使用的不是像 UDP 那样的 DatagramPacket,而是使用 InputStream/OutputStream。

我们如何从DataInputStream中获取byte[],类似这样的东西:

byte[] receiveData = new byte[64000];
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); 
receiveData=receivePacket.getData();

最佳答案

为了在套接字(流)上实现基于消息的协议(protocol),您基本上需要想出一些消息格式,然后在连接的两端读/写它。一个非常简单的格式是将消息的长度写入一个 4 字节的 int,然后发送消息字节(然后刷新流)。在接收端,读取一个 4 字节的 int,然后读取后面的字节数(注意限制读取方法调用,否则您可能会不小心读取下一条消息的一部分)。

public void writeMessage(DataOutputStream dout, byte[] msg, int msgLen) {
  dout.writeInt(msgLen);
  dout.write(msg, 0, msgLen);
  dout.flush();
}

public byte[] readMessage(DataInputStream din) {
  int msgLen = din.readInt();
  byte[] msg = new byte[msgLen];
  din.readFully(msg);
  return msg;
}

关于java - 使用 TCP 连接获取字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11588078/

相关文章:

Java泛型方法参数传递问题

c - 使用 recv 通过网络接收字符串

tcp - 更改 tcp_rmem 和 tcp_wmem

wcf - WCF服务地址的UDP广播

无法将字符串写入 .txt 文件

java - 如何在本地主机上的浏览器中运行 java .class 小程序

java - 在swing中显示文本流

java - 使用 Java 进行 XML 映射

tcp - 在 C++ 中查找 Basic Introduction of TCP/IP

linux - 获取收到的UDP数据包的目的地址