2012-06-02 69 views
2

我一直在尝试从我的自定义Cocoa应用程序(写在Objective-C当然)发送数据包到我的世界服务器。尽管如此,但我有点困惑。我是用Java做的。这很容易。尽管这样做是客观的,但事实证明它更具挑战性。发送数据包到我的世界服务器:目标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中的数据类型(主要是字符串)如何关联?

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

没有人知道吗?

回答

1

也许你遇到了网络/主机字节顺序问题?我对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,那么也许你不需要。