我已经对这个主题进行了相当多的研究,我发现这个问题经常被问到,但是没有一个人能得到我正在寻找的答案,最常见的解决方案是使用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客户端,服务器将完全正确地读取它并将其打印到控制台。
我真的不确定我做错了什么,但似乎没有太多关于它的信息。我需要的功能如下:
根据我的理解,你可以在 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端读取,它仍然无法通过。
答案 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));