套接字 - 获取和设置接收数据包的大小

时间:2015-08-12 10:56:43

标签: java c# sockets

我在这个问题上看到了不同的方法。 我有一个用java和c#client编写的服务器。

我发现的大多数数据发送示例数据都是使用以下方式发送的:

从C#客户端发送

TcpClient tcpClient = _tcpClient.Connect(ip, port);
NetworkStream stream = _tcpClient.GetStream();
BinaryWriter s = new BinaryWriter(stream);

//send some info
byte[] bytes = new byte[]{1,2,3}

//capsulated in thread
    s.Write(bytes);
    s.Flush();

收到

在Java服务器上收到

Socket socket = // create it on incoming connection
DataInputStream input = new DataInputStream(socket.getInputStream());

//we create some magical size byte array
byte[] bytes = new byte[4096];
input.read(bytes);

问题在于,神奇的大小字节数组看起来并不像一个可靠的解决方案。我讨厌创造一些我无法控制或不知道其内容的东西。 因此我想出的解决方案是首先发送字节数组大小

s.Write(bytes.length); //send int or byte array of the int value
s.Flush();
s.Write(bytes);
s.Flush();

并在收到

int size = input.readInt();
byte[] bytes = new byte[size];
input.read(bytes);

所以现在我有字节数组,所有内容都被完全填充。

我不知道为什么,但我对这个解决方案也有疑问,一定是因为我见过只有第一个解决方案的例子。您如何看待第二种解决方案,您可能会看到或者可能存在任何问题,或许有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

第二种解决方案很好。我们已在十多个项目中使用此解决方案