三星Galaxy S3上的iPhone和Android应用程序上的iOS应用程序需要在Wifi网络上相互通信。
我在iOS应用中使用CocoaAsyncSocket
库,在Android应用中使用java.net.Socket
。
== iOS app part ==
- (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应用程序发送消息,但没有运气。
答案 0 :(得分:0)
在Java / Android中,PrintWriter.println()
编写特定于操作系统的换行符。 CRLF
是Windows换行符。在Android上,它使用LF
代替。如果iOS阅读器仅预期CRLF
且不允许LF
,则永远不会触发它。
要强制使用CRLF,请改为使用PrintWriter.print()
:
public void sendMessage(String message) {
out.print(message + "\r\n");
}