【问题标题】:C# equivalent of Java's DataOutputStream?C# 相当于 Java 的 DataOutputStream?
【发布时间】:2014-12-11 00:49:32
【问题描述】:

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

对于我的服务器应用程序,我正在使用 Netty 一个基于 Java 的 NIO 网络库,它使用 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(字节)
  • WriteBytes(byte[])
  • WriteUTF(字符串)
  • WriteInt(int)
  • WriteLong(long)
  • WriteFloat(float)
  • WriteDouble(double)
  • WriteBoolean(boolean)

据我了解,您可以通过类型转换在 BinaryWriter 类中完成所有这些操作,但它似乎没有被 Java DataInputStream 接收

看了野田开的纪录片后,我想出了这个代码:

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 端以相同的方式读取。

【问题讨论】:

    标签: java c# networking stream netty


    【解决方案1】:

    你仔细阅读过Javadoc吗?

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

    【讨论】:

    • 我从未见过,但我仍然不完全了解如何去做;据我了解,BinaryWriter.Write(((byte[]) new byte[2]) + String); 就是它所说的,但我认为这不起作用。
    • 谢谢,我设法让这一切正常工作仅仅是因为您指出了加密更改。
    【解决方案2】:

    我写了一个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));
    

    【讨论】:

    • 链接已失效。而且我没有用谷歌搜索找到它。有机会更新吗?
    • @NightOwl888 - 我得在我的旧电脑上四处寻找源代码。周围有几个叉子可以找。
    • @Hobbyist - 你能上传 C# 中 DataOutputStream 和 DataInputStream 的源代码吗?
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 2011-06-29
    • 2010-09-24
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2014-09-29
    相关资源
    最近更新 更多