C#相当于Java的DataOutputStream?

时间:2014-10-15 20:02:11

标签: java c# networking stream netty

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

对于我的服务器应用程序,我使用 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客户端,服务器将完全正确地读取它并将其打印到控制台。

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

  • 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(),我可以获取发送的值,所以String的值为" Hello World& #34;将像这样发送

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

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

2 个答案:

答案 0 :(得分:2)

你仔细阅读过Javadoc吗?

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

答案 1 :(得分:1)

我已经编写了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));