我对这个主题做了很多研究,我发现这个问题经常被问到,但没有一个能找到我正在寻找的答案,最常见的解决方案是使用 BinaryWriter 类,但它似乎没有完成它的工作。
对于我的服务器应用程序,我正在使用 Netty 一个基于 Java 的 NIO 网络库,它使用数据输入和数据输出流。我有一个在 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 客户端,服务器将完美读取它并将其打印到控制台。
我真的不确定我做错了什么,但似乎没有太多关于它的信息。我需要的功能如下:
- 写入字节(字节)
- WriteBytes(字节[])
- 写入UTF(字符串)
- WriteInt(int)
- WriteLong(长)
- 写 float ( float )
- WriteDouble(双)
- 写 boolean 值( 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 端以相同的方式读取也是如此。
最佳答案
你仔细阅读过Javadoc吗?
DataInputStream.readUTF()
/DataOutputStream.writeUTF()
使用自己的编码方案。我不认为 .NET BinaryReader/Writer
可以与它们兼容 Unicode 字符串。但是,您可以手动将 Unicode 字符串序列化为长度数据后跟字节序列。
关于java - C# 相当于 Java 的 DataOutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26391091/