我正在开发一款应用程序,该应用程序需要能够在完全不同的设备上将自己的数据与其他安装的数据同步。远程设备可能是Android,iOS或Windows,它应该没有问题同步。整体上很标准的东西。这个想法是让一个设备发送对其他设备数据的请求,编译并发送回来,然后第一个设备处理它,在本地存储它需要的数据,然后发送第二个设备没有的自己的数据到第二个设备。
我使用UDP广播获取IP,然后使用XML over TCP套接字,运行得相当好。绝对没什么特别的。
不幸的是,它在某个特定情况下不起作用。具体来说,是与iOS设备通信的。这里有两个特殊的案例。第一个,其中android作为上面描述中的第一个设备(客户端)工作完美。绝对没有任何问题。但是第二个,其中android作为第二个设备(服务器),在最后的传输失败。
它表现得好像我只能从iOS设备读取一次发送,而且再也不会。它只是我可以读取的每个插槽的第一次写入,即使从我从tcpdump日志中可以看出来的东西,iOS设备将数据 写入tcp堆栈。 Android flat out没有注册它就在那里。直接socket.getInputStream()。read()无限地等待数据挂起。
我不知道问题可能是什么,除了模糊地怀疑iOS套接字会阻碍某些棘手的Apple恶作剧,因为当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设备无法正确读取套接字,我不能说实话。