在客户端和服务器之间传输数据并动态刷新

时间:2014-06-06 20:59:59

标签: java c# sockets networking tcp

我一直在玩测试客户端(用Java编写)和服务器(用C#/ .NET编写)之间传输数据。

我尝试过TCP客户端和服务器,但是当前有一个问题是刷新流。我意识到flush并不总是刷新流,所以我想知道是否有任何方法可以在没有.flush()的情况下以更可靠的方式刷新/发送流?

目前,客户端的重要部分看起来像这样(消息是一个字符串,serverSocket是一个Socket对象):

OutputStream output = serverSocket.getOutputStream();

byte[] buffer = message.getBytes();
int length = buffer.length;

output.write(ByteBuffer.allocate(4).putInt(length).array());
output.write(buffer);
output.flush();

,服务器如下所示:

NetworkStream stream = client.GetStream ();

byte[] sizeBuffer = new byte[4];
int read = stream.Read (sizeBuffer, 0, 4);

int size = BitConverter.ToInt32 (sizeBuffer, 0);
Databaser.log ("recieved byte message denoting size: " + size);

byte[] messageBuffer = new byte[size];
read = stream.Read (messageBuffer, 0, size);

string result = BitConverter.ToString (messageBuffer);
Databaser.log ("\tmessage is as follows: '" + result + "'");

其中,如果代码中不明显,则客户端发送4个字节,这些字节组合成一个32位整数,即消息的长度。然后我根据该长度阅读消息,并在转换器中构建将其转换为字符串。

正如我所说,我想知道如何刷新连接?我知道这段代码并不完美,但是当我在网络上使用TCP和UTF独占字符串消息时,我可以将其更改回来,但无论如何,在客户端关闭或关闭之前,连接不会从客户端发送任何内容连接。

1 个答案:

答案 0 :(得分:1)

问题可能是字节顺序。我有一个从平板电脑(java)发送到C#应用程序(Windows Intel)的应用程序,我使用的类似于你所做的,除了以下

ByteBuffer iLength = ByteBuffer.allocate(4);
iLength.order(ByteOrder.LITTLE_ENDIAN);
iLength.putInt(length);
output.write(iLength.array(), 0, 4);
output.write(buffer);
output.flush();

Java使用BIG-ENDIAN,Intel使用LITTLE-ENDIAN字节顺序。