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

Java 在客户端和服务器之间传输数据并动态刷新,java,c#,sockets,networking,tcp,Java,C#,Sockets,Networking,Tcp,我一直在尝试在测试客户机(用Java编写)和服务器(用C#/.NET编写)之间传输数据 我尝试了TCP客户机和服务器,但一直存在刷新流的问题,而当前的问题是刷新流。我意识到flush并不总是刷新流,所以我想知道是否有任何方法可以不使用.flush()或以更可靠的方式刷新/发送流? 当前,客户端的重要部分如下所示(消息是字符串,serverSocket是套接字对象): 服务器如下所示: NetworkStream stream = client.GetStream (); byte[] siz

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

我尝试了TCP客户机和服务器,但一直存在刷新流的问题,而当前的问题是刷新流。我意识到flush并不总是刷新流,所以我想知道是否有任何方法可以不使用.flush()或以更可靠的方式刷新/发送流?

当前,客户端的重要部分如下所示(消息是字符串,serverSocket是套接字对象):

服务器如下所示:

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字节顺序。

这些都不清楚您的实际问题是什么“Flush并不总是刷新流”肯定是不正确的,而且在关闭连接之前不会发送任何内容的说法也不正确。您在这里犯了一些基本的编程错误,例如忽略read()返回的计数,其中任何一个都足以导致问题。我将研究使用DataInoutStream的功能,特别是readInt()和readFully()。BIG-ENDIAN和LITTLE-ENDIAN似乎确实起了作用,并修复了我的代码,谢谢,我没有意识到这一点。我在自学这些东西,所以我不知道这里的一半重要内容,再次感谢。@Aeolingamenfel,不客气。但是要记住;我所编写的代码仅在发送到Intel机器或LITTLE-ENDIAN机器时使用。如果服务器恰好是一台BIG-ENDIAN机器,那么您又遇到了一些问题。但是现在你知道字节顺序的事实,所以你知道了。
ByteBuffer iLength = ByteBuffer.allocate(4);
iLength.order(ByteOrder.LITTLE_ENDIAN);
iLength.putInt(length);
output.write(iLength.array(), 0, 4);
output.write(buffer);
output.flush();