三星Galaxy S3上的iPhone和Android應用上的iOS應用需要在Wifi網絡上相互通信。iOS應用和Android應用之間的TCP Socket通信
我在iOS應用中使用CocoaAsyncSocket
庫,在Android應用中使用java.net.Socket
。
== iOS應用部分==
- (void)socket:(GCDAsyncSocket *)sender didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
[clientSocketList addObject:newSocket];
NSMutableDictionary *newClientInfo = [[NSMutableDictionary alloc] init];
[newClientInfo setObject:@"0" forKey:@"status"];
[clientInfoList addObject:newClientInfo];
[newSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
}
- (void) writeData:(NSData*)data to:(GCDAsyncSocket*)sock {
NSMutableData *dataWithLine = [data mutableCopy];
[dataWithLine appendData:[GCDAsyncSocket CRLFData]];
[sock writeData:dataWithLine withTimeout:-1 tag:0];
}
== Android部分==
public boolean connectServer() {
try {
socket = new Socket(SOMEIP, SOMEPORT);
binaryInput = socket.getInputStream();
this.input = new BufferedReader(new InputStreamReader(binaryInput));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
}
catch(Exception e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
while(status != STATUS_STOPPED) {
try {
String read = input.readLine();
//Doing stuff
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void sendMessage(String message) {
out.println(message);
}
在上面的代碼,iOS應用是在服務器和Android應用是客戶端。
什麼,我打算在上面的代碼做的是
Android應用程序發送的消息和iOS應用接收它。每條消息都由新的行字符標識。 Android應用程序發送消息
println
方法和iOS應用程序接收消息,直到收到CRLF(新行)字符。iOS應用程序發送消息,Android應用程序收到它。每條消息都由新的行字符標識。 iOS應用程序通過附加CRLF發送消息,Android應用程序通過
readline
方法接收消息。
問題是,當Android應用程序發送的消息,iOS應用的didReceiveData委託不叫。有一點很清楚,iOS應用程序套接字在流式傳輸中找不到CRLF字符。
我試圖通過在真實數據後附加CRLF字節([0x0d,0x0a])發送來自Android應用程序的消息,但沒有運氣。
Thanks.The實際的解決辦法是'了out.flush()'。解決了! – adeltahir 2014-10-17 18:15:57