- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为我正在参加的类(class)制作一个 HTTP 服务器作为项目,一周来我一直在尝试寻找解决方案。我有一个 DataInputStream,我需要等待客户端向我发送 http 请求,由于连接保持打开状态,可能需要几个小时才能发生这种情况。这是我的代码
DataInputStream dis=new DataInputStream(socket.getInputStream());
DataOutputStream dos =new DataOutputStream(socket.getOutputStream());
while(!socket.isClosed()){
try{
/**wait until there are new data in to the stream,if the connection is no more alive then close it*/
while(dis.available()==0){
if(alive==false){
socket.close();
break;
}
}
/*at this point the stream has new data ,or the alive attribute has been set to false */
if(!socket.isClosed()){
/*parse the request text */
Request request=new Request(dis,this);
/*generate a response based on the request*/
Response response=new Response(request,this);
/*send the response back to the client*/
response.send(dos);
/*log the details of the communication*/
Logger.log(toString(request,response,socket));
/*if the request is bad formatted or it has its Connection header set to close , close the connection after sending the response*/
if(request.isBadRequest() || !"keep-alive".equalsIgnoreCase(request.getHeader("Connection"))){
close();
}
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
在while(dis.available()==0)
部分,我正在等待流获得一些数据,但问题是,如果我有很多连接,我的服务器开始获得大量CPU时间,从而减慢我的计算机速度,因为它只是一次又一次地挂起循环,不给CPU机会进行良好的调度。如果dis.available()是一个阻塞命令,那么一切都会很完美。有什么解决方法吗?
最佳答案
InputStreams
已经在没有数据可用时阻塞在读取方法中。
您不需要这些 available()
调用或它们周围的循环。
您还应该注意,Socket.isClosed()
仅在您关闭套接字时才返回 true。它不会告诉对方是否已关闭连接。
关于java - 阻塞直到 DataInputStream 可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275163/
我正在制作一个简单的 TCP/IP 套接字应用 这样做有什么不同: DataInputStream in = new DataInputStream(clientSocket.getInputStre
1. 概述 在这个例子中,我们将用DataInputStream类来读取一个文件。数据输入流让应用程序以独立于机器的方式从底层输入流读取原始的Java数据类型。一个应用程序使用数据输出流来写数据,这些
我对 Java 编程和堆栈溢出都很陌生,今天早上我在遵循简单的代码时遇到了很大的麻烦。它有 3 个选项,将新用户添加到二进制文件,列出其中的每个用户并搜索特定用户以显示与其相关的所有其他数据(姓氏和出
我正在实现一个简单的客户端/服务器读取器,并使用 DataInputStream 将所有内容读取为字节,然后稍后进行解析。 这是我的阅读代码: String line; String requestS
我的 DataInputStream 有问题,它没有完全读取文件,经常(每约 33000 个字符)跳过 2-3 个字符。我正在尝试将文件(8 mb)解析为 json,并且由于字符串中跳过的字符,我无法
我在 Java 中使用 DataInputStream 和 DataOutputStream 时遇到了一个问题,如果没有一些非常愚蠢的措施,我就无法解决这个问题,并且想知道是否有人知道更好的方法(我非
我想从二进制文件构建 HashMap 。该二进制文件具有以下结构:第一个整数表示我必须从流中读取的整数数量,以便构建 HashMap ,后跟键/值对。 因此,对于具有三个值的 HashMap ,我总共
我正在尝试编写一个外部合并排序,但如果我已经关闭了第一个数据输入流,我似乎无法为文件创建第二个数据输入流。例如: public class test { private static Data
正如标题所说,如果可用字节多于缓冲区大小,并且在第一次读取时丢失了一些字节,DataInputStream.read() 是否可以覆盖以前读取的字节? 对等点之间交换固定大小的数据包,并且套接字上可能
我正在学习用 Java 进行读写,并且遇到了一个简单的练习。该程序从 2 个 txt 文件中读取,每个文件都包含行中的数字。它将每行数字相乘的结果写入输出文件。例如。 file 1 row 1 : 1
我正在做一项家庭作业,我必须连接到 http 服务器并使用套接字编程下载 html 文件和图像文件。 我做得很好,能够正确下载和编写 html 和图像文件。但是当我编辑代码以满足作业的要求时(网页必须
这个问题真让我头疼。非常简单的场景。使用 DataInputStream 通过 TCP 发送和接收文件。 这是写法 private boolean send(File file) { try
我有一个套接字客户端,每当我尝试从套接字读取输入流时,它都会挂起。 DataInputStream dis = new DataInputStream(socket.getInputStream())
我目前正在制作一个消息传递应用程序,稍后我还将为其添加加密。我有一台打开套接字并等待客户端连接的服务器。客户端连接后,它会为该客户端创建一个新线程。然后等待消息等。 我遇到的问题是,当我尝试将公钥指数
如果我在 DataInputStream 上调用 read(),它会占用 CPU 周期等待数据,还是会产生当前线程并被中断信号唤醒,表明数据已到达? 我的动机是确定流读取器是否需要在其自己的线程中。占
我的Java项目(我是客户端)包括通过TCP套接字连接发送请求和读取响应。通过套接字,我创建一个输出和输入流,分别用于发送和接收数据。一切正常,除了消息的结尾,即我通过 DataOutputStrea
我正在为学校作业创建一个文件服务器应用程序。我目前拥有的是一个简单的 Client 类,它通过 TCP 发送图像,还有一个 Server 类接收图像并将其写入文件。 这是我的客户端代码 import
我有一个要加载的文件格式,其中包含 OpenGL 对象的原始数据。 一切都很好,但数据是小端编码的。 是否有一个 java 类可以完成 DataInputStream 的确切工作但使用小端,还是我必须
我必须创建一个应用程序来检索网络上的 xml 文件,并将其存储在 Blackberry 手机的 SD 卡上。 xml 文件由 cron 作业更新。因此,如果数据已添加到此 xml 文件,我希望应用程序
我用java编写了以下程序来使用DataInput\Output Stream复制文件。 import java.io.*; public class FileCopier { public
我是一名优秀的程序员,十分优秀!