C#相当于Java的DataOutputStream?

我已经对这个主题做了很多研究,我发现这个问题经常被问到,但是没有一个人能得到我正在寻找的答案,最常见的解决方案是使用随附的BinaryWriter类C#,但它似乎没有做它的工作。

对于我的服务器应用程序,我使用Netty作为基于Java的NIO网络库,它使用DataInput和DataOutput Streams。 我有一个在java中工作的客户端,但它仅用于测试目的,我现在正在将其转移到C#以将其放入我的游戏中。

这是基本格式的C#代码,只是试图让事情暂时起作用。

Client = new TcpClient (); try { Client.Connect (IPAddress.Parse ("127.0.0.1"), PORT); Stream = Client.GetStream(); ClientOutput = new BinaryWriter(Stream); ClientInput = new BinaryReader(Stream); ClientOutput.Write ((string) "UserIsBob"); ClientOutput.Write ((string) "MyPassLol"); ClientOutput.Flush(); } 

现在,这看起来很好; 但这是问题,在使用时

 DataInputStream.readUTF() 

在Java服务器上,没有任何反应; 但是,如果我使用

 DataOutputStream.writeUTF(String) 

从Java客户端,服务器将完美地读取它并将其打印到控制台。

我真的不确定我做错了什么,但似乎没有太多关于它的信息。 我需要的function如下:

  • WriteByte(字节)
  • WriteBytes(字节[])
  • WriteUTF(字符串)
  • WriteInt(INT)
  • WriteLong(长)
  • WriteFloat(浮点)
  • WriteDouble(双)
  • WriteBoolean(布尔)

根据我的理解,你可以通过类型转换在BinaryWriter类中完成所有这些操作, 但它似乎没有被Java DataInputStream拾取

看完nodakai发布的纪录片后,我想出了这段代码:

 void WriteUTF(string utf) { short buffer = (short)System.Text.ASCIIEncoding.ASCII.GetByteCount(utf); ClientOutput.Write ((short)buffer); ClientOutput.Write ((string)utf); } 

但是,它仍然无效。

我做了一些调查,发现如果我使用InputStream.ReadShort() ,我可以得到发送的值,所以具有值“Hello World”的String将像这样发送

 WriteShort(11) WriteString("Hello World") Flush() 

但是,当在C#中执行等效操作时,它仍然无法通过,即使它以相同的方式在java端读取。

你仔细阅读过Javadoc吗?

  • DataOutputStream.writeUTF()

DataInputStream.readUTF() / DataOutputStream.writeUTF()使用自己的编码方案。 我不认为.NET BinaryReader/Writer可以与Unicode字符串兼容。 但是,您可以手动将Unicode字符串序列化为长度数据,后跟字节序列。

我编写了一个Java的DataInputStream和DataOutputStream的C#转换,你可以在这里收集它们。

https://bitbucket.org/CTucker1327/c-datastreams/src

要构造这些类,您可以将BinaryWriter或BinaryReader传递给构造函数。

构造DataOutputStream

 DataOutputStream out = new DataOutputStream(new BinaryWriter(Stream)); 

构造DataInputStream

 DataInptuStream in = new DataInputStream(new BinaryReader(Stream));