发送 C# 和 Java 的套接字数据 - 总体和具体
Sockets data sending C# and Java - Overally & Specifically
我有几个关于总体 "sending" 理念的问题,以及关于通过套接字发送各种数据类型和结构的选项的具体问题。
现阶段
我有 Java 应用程序,它的行为类似于用 C# 编写的服务器和客户端。
我成功地连接并从 C# 发送整数到 Java。
Java
while(true){
try{
int a = input.readInt(); //input is DataInputStream which is initialized in constructor
Console.LogClient("Received {"+a+"}");
}catch(IOException e){
e.printStackTrace();
}
}
C#
TcpClient client = new TcpClient(ip, port);
//Connection established
int value = 11;
System.out.println("Sending: "+value);
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)Array.Reverse(bytes);
BinaryWriter a = new BinaryWriter(client.GetStream());
a.Write(bytes);
a.Flush();
问题
- Write() 究竟是如何工作的?传递的参数被视为单独的数据包数据集并立即发送(在 Write() 上)和 flush() ..clears。 。 某物?
或者 Write() 和 "add to" 数据集一样工作,所有内容实际上都在 flush()?
上发送
- 据我了解,要讨论 C# <-> Java 您发送的所有内容都必须转换为较低级别的 byte[] 数组?虽然原始单值可能很容易,但发送 float[] 或 int[]?
怎么样?
- 这和2类似,如果我想发送string、float[]和[=36=怎么办? ]int[],但是 client/server 不知道它会收到。我必须定义特定的“patterns”或“header”吗?我必须 send/write 每个元素都由它自己或组合?我在这里迷路了。
- 我未能发送 string,我使用 a.Write("someText"); 并使用 input.readUTF(); 但它什么也没做,看起来像冻结了。我什至尝试转换为 byte[] or/and 并翻转到 big endian.
未来计划
我想稍后学习并实施一些优化,例如压缩。据我了解,这是纯粹的 byte[] 操作?如果是这样,BinaryWriter (C#) 和 DataInputStream/DataOutputStream (Java) 是最佳解决方案吗?或者可能会有问题,最好是交给其他处理此类工作的 class。
我希望有人能对此有所启发。
非常感谢!
- 快速查看 BinaryWriter class 的文档,您可以了解到函数
write(byte[] array)
将字节数组直接写入底层流。这意味着 flush()
在这里可能不会有所作为。实际引用:"Writes a byte array to the underlying stream."
- 您想要做的是 find/implement C# 和 Java 的序列化库,因为这些语言并不以二进制方式表示对象。这样做的一种方法可能是用一个唯一的代码包装每个对象,您可以在两侧跟踪该代码(最好先阅读序列化)。
- 查看 Java 网络库 kryonet 至少可以帮助您解决问题的 Java 部分。 (它是一个Java到Java的序列化库)
我只是在写一些基础知识,如果我完全是瞎写的,请指正
我有几个关于总体 "sending" 理念的问题,以及关于通过套接字发送各种数据类型和结构的选项的具体问题。
现阶段
我有 Java 应用程序,它的行为类似于用 C# 编写的服务器和客户端。 我成功地连接并从 C# 发送整数到 Java。
Java
while(true){
try{
int a = input.readInt(); //input is DataInputStream which is initialized in constructor
Console.LogClient("Received {"+a+"}");
}catch(IOException e){
e.printStackTrace();
}
}
C#
TcpClient client = new TcpClient(ip, port);
//Connection established
int value = 11;
System.out.println("Sending: "+value);
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)Array.Reverse(bytes);
BinaryWriter a = new BinaryWriter(client.GetStream());
a.Write(bytes);
a.Flush();
问题
- Write() 究竟是如何工作的?传递的参数被视为单独的数据包数据集并立即发送(在 Write() 上)和 flush() ..clears。 。 某物? 或者 Write() 和 "add to" 数据集一样工作,所有内容实际上都在 flush()? 上发送
- 据我了解,要讨论 C# <-> Java 您发送的所有内容都必须转换为较低级别的 byte[] 数组?虽然原始单值可能很容易,但发送 float[] 或 int[]? 怎么样?
- 这和2类似,如果我想发送string、float[]和[=36=怎么办? ]int[],但是 client/server 不知道它会收到。我必须定义特定的“patterns”或“header”吗?我必须 send/write 每个元素都由它自己或组合?我在这里迷路了。
- 我未能发送 string,我使用 a.Write("someText"); 并使用 input.readUTF(); 但它什么也没做,看起来像冻结了。我什至尝试转换为 byte[] or/and 并翻转到 big endian.
未来计划
我想稍后学习并实施一些优化,例如压缩。据我了解,这是纯粹的 byte[] 操作?如果是这样,BinaryWriter (C#) 和 DataInputStream/DataOutputStream (Java) 是最佳解决方案吗?或者可能会有问题,最好是交给其他处理此类工作的 class。
我希望有人能对此有所启发。
非常感谢!
- 快速查看 BinaryWriter class 的文档,您可以了解到函数
write(byte[] array)
将字节数组直接写入底层流。这意味着flush()
在这里可能不会有所作为。实际引用:"Writes a byte array to the underlying stream." - 您想要做的是 find/implement C# 和 Java 的序列化库,因为这些语言并不以二进制方式表示对象。这样做的一种方法可能是用一个唯一的代码包装每个对象,您可以在两侧跟踪该代码(最好先阅读序列化)。
- 查看 Java 网络库 kryonet 至少可以帮助您解决问题的 Java 部分。 (它是一个Java到Java的序列化库)
我只是在写一些基础知识,如果我完全是瞎写的,请指正