【问题标题】:Transferring Data Between Client and Server and Dynamically Flush在客户端和服务器之间传输数据并动态刷新
【发布时间】:2014-06-06 20:59:59
【问题描述】:

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

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

目前客户端的重要部分是这样的(message是字符串,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 独占字符串消息传递时,但无论哪种方式,在客户端关闭或关闭之前,连接都不会从客户端发送任何内容连接。

【问题讨论】:

  • 从这些中看不出你的实际问题是什么。 “刷新并不总是刷新流”当然是不正确的,在关闭连接之前什么都不会发送的说法也不是正确的。您在这里犯了许多基本的编程错误,例如忽略 read() 返回的计数,其中任何一个都足以导致问题。我会使用 DataInoutStream 的工具进行调查,特别是 readInt() 和 readFully()。

标签: java c# sockets networking tcp


【解决方案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 字节顺序。

【讨论】:

  • BIG-ENDIAN 和 LITTLE-ENDIAN 似乎确实有所不同,并修复了我的代码,谢谢,我不知道这一点。我是自学这些东西,所以我不知道这里的重要背景的一半,再次感谢。
  • @Aeolingamenfel 不客气。但请记住;我编码的只是发送到英特尔机器或 LITTLE-ENDIAN 机器时。如果服务器恰好是 BIG-ENDIAN 机器,那么您又会遇到一些问题。但是现在你知道字节顺序的事实,所以你知道了。
猜你喜欢
  • 2022-01-05
  • 2015-02-24
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多