我对这个主题进行了相当多的研究,发现这个问题经常被问到,但没有一个答案是我正在寻找的。最常见的解决方案是使用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端以相同的方式读取,也无法实现。
BinaryWriter.Write(((byte[]) new byte[2]) + String);
是指这个,但我没有看到它起作用。 - Hobbyist