2012-06-02 71 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,那麼也許你不需要。