【问题标题】:Sending packets to Minecraft server: Objective c向 Minecraft 服务器发送数据包:目标 c
【发布时间】:2012-06-07 05:05:58
【问题描述】:

我一直在尝试从我的自定义 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 中是如何关联的?

感谢您的帮助,谢谢!

没人知道吗?

【问题讨论】:

    标签: objective-c cocoa networking packet minecraft


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2021-07-11
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多