- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在阻塞的 SocketChannel
上创建了一个 ObjectInputSteam
和 ObjectOutputStream
并尝试同时读取和写入。我的代码是这样的:
socketChannel = SocketChannel.open(destNode);
objectOutputStream = new ObjectOutputStream(Channels.newOutputStream(socketChannel));
objectInputStream = new ObjectInputStream(Channels.newInputStream(socketChannel));
Thread replyThread = new Thread("SendRunnable-ReplyThread") {
@Override
public void run() {
try {
byte reply = objectInputStream.readByte();//(A)
//..process reply
} catch (Throwable e) {
logger.warn("Problem reading receive reply.", e);
}
}
};
replyThread.start();
objectOutputStream.writeObject(someObject);//(B)
//..more writing
问题是第 (B) 行的写入阻塞,直到第 (A) 行的读取完成(阻塞 SelectableChannel#blockingLock()
返回的对象)。但是应用程序逻辑规定,在所有写入完成之前读取不会完成,因此我们有一个有效的死锁。
SocketChannel
javadocs 说支持并发读写。
当我尝试常规的 Socket 解决方案时,我没有遇到这样的问题:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
但是,我无法利用 FileChannel#transferTo(...)
最佳答案
这似乎是 java.nio.channels.Channels
中的错误(感谢 Tom Hawtin;下次将其作为答案发布)。描述了一个很好的描述和解决方法 here (实际上是 Tom 列出的错误的副本):
我测试了解决方法并且它有效。
关于Java:是否可以通过 Object(In|Out)putStreams 在阻塞的 SocketChannel 上进行并发读写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/174774/
我在阻塞的 SocketChannel 上创建了一个 ObjectInputSteam 和 ObjectOutputStream 并尝试同时读取和写入。我的代码是这样的: socketChannel
我正在使用 Firebase 存储从 Android 应用程序上传文件。从 FirebaseStorage 获取文件存储引用后,使用 uploadTask 正确上传文件。我的发现是,在 uploadT
我是一名优秀的程序员,十分优秀!