发送 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();

问题

  1. Write() 究竟是如何工作的?传递的参数被视为单独的数据包数据集并立即发送(在 Write() 上)和 flush() ..clears。 。 某物? 或者 Write() 和 "add to" 数据集一样工作,所有内容实际上都在 flush()?
  2. 上发送
  3. 据我了解,要讨论 C# <-> Java 您发送的所有内容都必须转换为较低级别的 byte[] 数组?虽然原始单值可能很容易,但发送 float[]int[]?
  4. 怎么样?
  5. 这和2类似,如果我想发送stringfloat[]和[=36=怎么办? ]int[],但是 client/server 不知道它会收到。我必须定义特定的“patterns”或“header”吗?我必须 send/write 每个元素都由它自己或组合?我在这里迷路了。
  6. 我未能发送 string,我使用 a.Write("someText"); 并使用 input.readUTF(); 但它什么也没做,看起来像冻结了。我什至尝试转换为 byte[] or/and 并翻转到 big endian.

未来计划

我想稍后学习并实施一些优化,例如压缩。据我了解,这是纯粹的 byte[] 操作?如果是这样,BinaryWriter (C#) 和 DataInputStream/DataOutputStream (Java) 是最佳解决方案吗?或者可能会有问题,最好是交给其他处理此类工作的 class。

我希望有人能对此有所启发。

非常感谢!

  1. 快速查看 BinaryWriter class 的文档,您可以了解到函数 write(byte[] array) 将字节数组直接写入底层流。这意味着 flush() 在这里可能不会有所作为。实际引用:"Writes a byte array to the underlying stream."
  2. 您想要做的是 find/implement C# 和 Java 的序列化库,因为这些语言并不以二进制方式表示对象。这样做的一种方法可能是用一个唯一的代码包装每个对象,您可以在两侧跟踪该代码(最好先阅读序列化)。
  3. 查看 Java 网络库 kryonet 至少可以帮助您解决问题的 Java 部分。 (它是一个Java到Java的序列化库)

我只是在写一些基础知识,如果我完全是瞎写的,请指正