1

我正在开发一个应用程序,该应用程序需要能够将自己的数据与完全不同设备上另一个安装的数据同步。远程设备可能是 Android、iOS 或 Windows,并且应该可以毫无问题地同步。总体上相当标准的东西。这个想法是让一个设备发送对其他设备数据的请求,编译它并将其发送回,然后第一个设备处理它,在本地存储它需要的内容,然后发送第二个设备没有的自己的数据转到第二个设备。

我使用 UDP 广播作为 IP,然后使用 XML over TCP 套接字启动并运行得相当好。绝对没有什么特别之处。

不幸的是,它在一种特定情况下不起作用。具体来说,就是与 iOS 设备通信。这里有两个特殊情况。第一个,在上面的描述中,android 作为第一个设备(客户端)工作得很好。绝对没有任何问题。但是第二个,其中 android 作为第二个设备(服务器),在最终传输时失败。

它的行为就好像我只能从 iOS 设备读取一次发送,并且再也无法读取。这只是我可以读取的每个套接字的第一次写入,尽管从 tcpdump 日志和诸如此类的信息中可以看出,iOS 设备正在将数据写入tcp 堆栈。Android 完全没有注册它的存在。一个直接的 socket.getInputStream().read() 无限挂起等待数据。

我不知道问题可能是什么,除了一个模糊的怀疑 iOS 套接字做了一些妨碍苹果的诡计,当 iOS 尝试与 Windows 同步时也会出现同样的问题。

有没有人遇到过这样的问题并且知道如何解决它?或者甚至只是知道等式的哪一边导致了问题?

非常感谢您提前。

这是一些代码,因为评论中的人问:

        server = new ServerSocket(portNum);
        socket = server.accept();

        byte[] lenBuffer = new byte[4];
        socket.getInputStream().read(lenBuffer, 0, lenBuffer.length);
        int lengthToRead = ByteBuffer.wrap(lenBuffer).order(ByteOrder.LITTLE_ENDIAN).getInt();

        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        StringBuilder buffer = new StringBuilder();

        int totalReadSoFar = 0;
        String line;
        while( totalReadSoFar < lengthToRead && (line = reader.readLine()) != null  ){
            buffer.append(line);
            totalReadSoFar += line.getBytes().length + 1;
        }

        if( buffer.toString().equals("syncCommand") )
            syncOverSocket(socket);

syncOverSocket 在这里:

    String xml = buildXml(outSyncData);

    byte[] encryptedData = encryptXml(xml, localPin);
    encryptedData = Base64.encode(encryptedData, Base64.NO_WRAP);

    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
    ByteBuffer byteBuffer = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
    byteBuffer.putInt(encryptedData.length);
    byte[] bytes = byteBuffer.array();
    dataOutputStream.write(bytes);
    dataOutputStream.write(encryptedData);
    dataOutputStream.flush();

    byte[] lenBuffer = new byte[4];
    socket.getInputStream().read(lenBuffer, 0, lenBuffer.length);
    int lengthToRead = ByteBuffer.wrap(lenBuffer).order(ByteOrder.LITTLE_ENDIAN).getInt();

    byte[] finalResult = new byte[0];
    byte[] buffer = new byte[1024];
    int totalReadSoFar = 0;
    int justRead;
    while( totalReadSoFar < lengthToRead && (justRead = socket.getInputStream().read(buffer, 0, 1024)) > -1 ){
        finalResult = concat(finalResult, buffer, justRead);
        totalReadSoFar += justRead;
    }

问题是最终的“socket.getInputStream().read(lenBuffer, 0, lenBuffer.length);”。它到达那条线没有错误,然后永远挂起等待数据。有些东西阻止了数据通过,要么是 iOS 设备没有正确发送,要么是 Android 设备没有正确地从套接字读取,我不能老实说是什么。

4

0 回答 0