我一直在尝试从我的自定义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/