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));