在客户端和服务器之间传输数据并动态刷新
本文关键字:数据 动态刷新 传输 之间 客户端 服务器 | 更新日期: 2023-09-27 18:07:21
我一直在测试客户端(用Java编写)和服务器(用c#/. net编写)之间传输数据。
我尝试了TCP客户端和服务器,但一直存在并且当前存在冲洗流的问题。我意识到冲洗并不总是冲洗流,所以我想知道是否有任何方法冲洗/发送流没有。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独占字符串消息传递时,但无论哪种方式,连接都不会从客户端发送任何东西,直到客户端关闭或关闭连接。
问题可能出在字节顺序上。我有一个从平板电脑(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。