2

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

这是我正在使用的代码:

- (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?
}

我事先已经与服务器建立了成功的连接,但我真的不知道我是否正确发送了数据包。有人可以解释一下我应该如何发送各种数据类型和对象。(int, byte/char, short, double, NSString, BOOL/bool)

此外,是否有任何特定或通用的方式来发送类似于 Minecraft 所需的数据包?

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

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

没人知道?

4

1 回答 1

1

也许您遇到了网络/主机字节顺序问题?我对 Minecraft 知之甚少 - 但我注意到这里提到Minecraft 协议中的 short 使用网络字节顺序,这是大端(所有其他数据类型都是 1 字节长,因此字节序不相关)。所有 x86 机器都使用 little-endian。

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

于 2012-06-14T23:24:17.180 回答