iOS应用和Android应用之间的TCP套接字通信

时间:2014-10-17 17:47:41

标签: sockets

三星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应用程序发送消息,但没有运气。

1 个答案:

答案 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");
}