Sockets iOS应用程序和Android应用程序之间的TCP套接字通信
iPhone上的iOS应用程序和三星Galaxy S3上的Android应用程序需要通过Wifi网络相互通信 我在iOS应用程序中使用CocoaAsyncSocket库,在Android应用程序中使用java.net.Socket ==iOS应用程序部分==Sockets iOS应用程序和Android应用程序之间的TCP套接字通信,sockets,Sockets,iPhone上的iOS应用程序和三星Galaxy S3上的Android应用程序需要通过Wifi网络相互通信 我在iOS应用程序中使用CocoaAsyncSocket库,在Android应用程序中使用java.net.Socket ==iOS应用程序部分== - (void)socket:(GCDAsyncSocket *)sender didAcceptNewSocket:(GCDAsyncSocket *)newSocket { [clientSocketList addObject
- (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];
}
==安卓部分==
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应用程序发送消息,但没有成功。在Java/Android中,PrintWriter.println写入操作系统特定的换行符。CRLF是窗口换行符。在Android上,它使用LF。如果iOS读卡器只需要CRLF而不允许LF,则永远不会触发
要强制CRLF,请改用PrintWriter.print:
谢谢。实际的解决方案已经过时了。解决了!
public void sendMessage(String message) {
out.print(message + "\r\n");
}