C#中等同于Java的DataOutputStream的类是什么?

3

我对这个主题进行了相当多的研究,发现这个问题经常被问到,但没有一个答案是我正在寻找的。最常见的解决方案是使用C#附带的BinaryWriter类,但似乎它并没有起到作用。

对于我的服务器应用程序,我使用基于Java的NIO网络库Netty,它使用DataInput和DataOutput流。我有一个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客户端发送的消息,服务器可以完美地读取并将其打印到控制台上。
我真的不确定我做错了什么,但好像没有太多相关信息。我需要的功能如下:
- WriteByte(byte) - WriteBytes(byte[]) - WriteUTF(String) - WriteInt(int) - WriteLong(long) - WriteFloat(float) - WriteDouble(double) - WriteBoolean(boolean)
据我所知,您可以通过类型转换在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”的字符串将被发送如下:
WriteShort(11)
WriteString("Hello World")
Flush()

然而,在C#中进行相同的操作时,即使在Java端以相同的方式读取,也无法实现。

2个回答

2
你仔细阅读了Javadoc吗?

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


我从未见过这个,但我仍然不完全明白如何去做。据我所知,BinaryWriter.Write(((byte[]) new byte[2]) + String); 是指这个,但我没有看到它起作用。 - Hobbyist
谢谢,因为你指出了加密更改,我成功地让它全部运作。 - Hobbyist

1
我已经编写了一个C#版本的Java DataInputStream和DataOutputStream,您可以在这里获取它们。

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

2
链接已失效。我在谷歌搜索中也没有找到它。您有可能更新一下吗? - NightOwl888
1
@NightOwl888 - 我得到我旧电脑上找找这个源代码。有几个分支版本在网上你可以查找。 - Hobbyist
1
@Hobbyist - 你能上传一下C#中DataOutputStream和DataInputStream的源代码吗? - KF-SoftwareDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接