我一直在尝试从我的自定义Cocoa应用程序(当然是用Objective-C编写)将数据包发送到Minecraft服务器。我对如何做到这一点有些困惑。我用Java完成的。那很容易。这样做是客观的,尽管事实证明这更具挑战性。

这是我正在使用的代码:

- (void)handshake
{
    PacketHandshake *packet = [PacketHandshake packetString:[NSString stringWithFormat:@"%@;%@:%i", username, IP, PORT]];
    [packet writeData:dataOut];
}


哪个调用:

- (void)writeData:(NSOutputStream *)dataOut
{
    [super writeData:dataOut]; //Writes the "header" which is a char with the value of 0x02 (char packetID = 0x02)
    NSUInteger len = [string lengthOfBytesUsingEncoding:NSUTF16BigEndianStringEncoding]; //Getting the length of the string i guess?
    NSData *data = [string dataUsingEncoding:NSUTF16BigEndianStringEncoding]; //Getting string bytes?
    [dataOut write:(uint8_t*)len maxLength:2]; //Send the length?
    [dataOut write:[data bytes] maxLength:[data length]]; //Send the actual string?
}


我已经预先建立了到服务器的成功连接,但是我真的不知道我是否正确发送了数据包。有人可以解释一下我应该如何发送各种数据类型和对象。 (整数,字节/字符,短整数,双精度,NSString,布尔/布尔)

此外,是否有任何特定或通用的方式发送数据包(如Minecraft所需的数据包)?

好的,我想现在的问题是:Java和Objective-C中的数据类型(主要是字符串)如何关联?

任何帮助表示赞赏,谢谢!

没人知道?

最佳答案

也许您遇到了网络/主机字节顺序问题?我对Minecraft知之甚少,但我注意到提到here时,Minecraft协议中的短裤使用网络字节顺序,即大字节序(所有其他数据类型均为1字节长,因此字节序无关)。
所有x86机器都使用little-endian。

我不知道您的PacketHandshake类在发送数据之前是否正在转换数据-否则,您可以使用c库函数ntohs()htons(),为此您需要包括sys / types.h和
netinet / in.h
该链接还提到字符串是标准ASCII字符的64字节数组,用0x20s填充。您可以通过执行[string UTF8String]从NSString中获取ASCII值,它返回const char*-即您的标准C字符串以0x0结尾,然后可以填充它。但是,如果它仅适用于Java,则可能不需要。

关于objective-c - 将数据包发送到Minecraft服务器: objective-c ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10859049/

10-10 10:07
查看更多