我的问题是:有没有办法执行套接字 OutputStream 关闭,或者它不正确/完全实现,因为它应该由诺基亚实现?(J2ME nokia 实现,在 nokia c6-00 测试并且没有关闭流,在模拟器上测试并且工作正常)
主要问题是 J2SE 服务器应用程序没有获得流信息的结尾,条件 read(buffer) == -1 永远不会为真,尝试从空流中读取并挂起,直到客户端被强制终止。这适用于服务器端应用程序上非常非常非常丑陋的解决方法
Thread.sleep(10);//wait some time for data else you would get stuck........
while ((count = dataInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, count);
if (count != BUFFER_SIZE_1024 || dataInputStream.available() == 0) { //the worlds worst condition ever written... but works
break;
}
Thread.sleep(10);//wait for data input to get some data for dataInputStream.available() to return != 0 if client still sends data else you would not read all data......
}
但是这个解决方案是绝对不能接受的(我对诺基亚 java 编码一无所知,我遗漏了一些东西,或者它可能类似于某种 nokia-J2ME 编码标准,我应该习惯它或改变平台)
发送数据后我无法关闭客户端套接字,因为服务器在接收和处理数据后向客户端发送响应。
它看起来像这样:J2ME 客户端 -> J2SE 服务器(由于客户端不执行输出流关闭而挂起读取) -> J2ME
我尝试过:关闭 J2ME 客户端上的 dataOutputStream - 无效果 setSocketOptions(KEEPALIVE、SNDBUF 等) - 无效果或错误
目标设备上似乎没有任何效果
抱歉,在与小 Java 进行了这场无意义的战斗之后,我现在有点生气。
我已经寻找解决方案,但似乎没有工作
客户端代码:
SocketConnection socketConnection = (SocketConnection) Connector.open("socket://" + ip + ":" + port);
int count;
byte[] buffer = new byte[BUFFER_SIZE_1024];
// client -> server
DataOutputStream dataOutputStream = new DataOutputStream(socketConnection.openDataOutputStream());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
while ((count = byteArrayInputStream.read(buffer)) != -1) {
dataOutputStream.write(buffer, 0, count);
dataOutputStream.flush();
}
dataOutputStream.close();
byteArrayInputStream.close();