我正在编写一个Java服务器,它使用普通套接字来接受来自客户端的连接.我正在使用相当简单的模型,其中每个连接在阻塞模式下都有自己的线程读取.伪代码:
handshake();
while(!closed) {
length = readHeader(); // this usually blocks a few seconds
readMessage(length);
}
cleanup();
Run Code Online (Sandbox Code Playgroud)
(线程是从一个创建的,Executors.newCachedThreadPool()所以启动它们不应该有任何重大的开销)
我知道这是一个天真的设置,如果线程是专用的OS线程,它不会很好地扩展到许多连接.但是,我听说Java中的多个线程可以共享一个硬件线程.真的吗?
知道我将在Linux上使用Hotspot VM,在具有8核和12GB RAM的服务器上,您认为这种设置适用于数千个连接吗?如果没有,有哪些替代方案?
有人可以解释为什么这个结构不起作用:
while (fileInputStream.available()>0) {
fileOutputStream.write(fileInputStream.read());
}
Run Code Online (Sandbox Code Playgroud)
这个工作得很好:
while (fileInputStream.available()>0) {
int data = fileInputStream.read();
fileOutputStream.write(data);
}
Run Code Online (Sandbox Code Playgroud)
至于我,他们是相同的,但第一个不会正确写入数据(将写入一半的文件长度/数据).
我正在用 Java 编写一个 Android 应用程序,该应用程序使用 Android 配件 API 与 USB 配件进行通信。
在谷歌文档并没有给出实际读取和写入数据,只是如何打开附件进行通信的例子。
它还说明了两件事:
我实现了这样的阅读:
/** boiler plate from example docs: **/
fileDescriptor = usbManager.openAccessory(accessory);
if (fileDescriptor != null) {
FileDescriptor fd = fileDescriptor.getFileDescriptor();
inputStream = new FileInputStream(fd);
readBuffer = new byte[16384];
// ... some more code that is not relevant for reading data ... //
}
/** my code in separate thread: **/
int read;
while ((read = …Run Code Online (Sandbox Code Playgroud) 当我使用常规套接字时,我可以调用 getInputStream() 并使用 available() 来查看有多少字节可用。我切换到 SSLSocket,但由于某种原因,现在 available() 总是返回 0。当我阅读时,我仍然可以获得数据。如何判断 SSLSocket 中是否有可用数据,以便在没有数据时可以不阻塞地为其提供服务?
笔记: