Java IOUtils.toString需要很长时间
我有一个类,它打开一个HTTP服务器并监听一个端口。回复是一个http头加上一个json对象。该类从服务器获取输入流,将其转换为字符串,过滤http头并解析json对象 问题是从输入流到字符串的转换大约需要3秒钟。有没有办法更快地读取输入流Java IOUtils.toString需要很长时间,java,json,inputstream,httpserver,Java,Json,Inputstream,Httpserver,我有一个类,它打开一个HTTP服务器并监听一个端口。回复是一个http头加上一个json对象。该类从服务器获取输入流,将其转换为字符串,过滤http头并解析json对象 问题是从输入流到字符串的转换大约需要3秒钟。有没有办法更快地读取输入流 public class GamestateListener { private static int PORT = 3001; // Port specified in your cfg public static ServerSocket listen
public class GamestateListener {
private static int PORT = 3001; // Port specified in your cfg
public static ServerSocket listenServer;
private static JSONObject MYJSONOBJ;
public GamestateListener() {
try {
listenServer = new ServerSocket(PORT); // open new Server Socket
System.out.println("Started Socket..."); // printing out started
// listening
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public JSONObject listenAndParseJSON() throws IOException {
System.out
.println("Listening for connection on port " + PORT + " ...."); // printing
// out
// started
// listening
try (Socket socket = listenServer.accept()) { // wait for connection
System.out.println("Start get From Socket "
+ System.currentTimeMillis());
InputStream mis = socket.getInputStream();
System.out.println("Stop get From Socket "
+ System.currentTimeMillis());
String responseString = IOUtils.toString(mis, "UTF-8");
System.out.println("Stop to String "
+ System.currentTimeMillis());
MYJSONOBJ = new JSONObject(responseString.substring(responseString
.indexOf("{")));// split the response string
return MYJSONOBJ;// return the json obj
} catch (Exception e) {
MYJSONOBJ = new JSONObject("{ERROR:True}");// create error obj
return MYJSONOBJ;// return it
}
}
}
你不是在衡量你认为自己是什么。在这里:
System.out.println("Start get From Socket "
+ System.currentTimeMillis());
InputStream mis = socket.getInputStream();
System.out.println("Stop get From Socket "
+ System.currentTimeMillis());
。。。当getInputStream()
返回时,您似乎认为已经读取了所有数据。你没有。你刚刚得到了一条可以阅读的信息流。这意味着有联系,但仅此而已
如果要测量读取所有数据(而不是实际处理数据)所需的时间,可以执行以下操作:
System.out.println("Start get From Socket "
+ System.currentTimeMillis());
InputStream mis = socket.getInputStream();
byte[] buffer = new byte[8192];
// Read all the data (but ignore it)
while ((mis.read(buffer)) != -1) ;
System.out.println("Stop get From Socket "
+ System.currentTimeMillis());
当然,在代码的其余部分将不会有任何数据需要读取,但您将看到读取数据需要多长时间。我猜大概需要3秒钟。。。这可能是由于网络速度慢,或者客户端需要很长时间才能发送所有数据。(它可以连接,休眠2.9秒,然后发送一组数据。)json对象有多大?您是否检查过,数据实际发送到服务器的速度有多快?我认为您的impl没有测量toString转换。它测量读取inputstream并将其转换所需的时间。所以我认为这3秒钟与你的人际网络有关。非常感谢。客户端是csgo游戏状态集成。已经有一些python脚本使用它,它们似乎能够对发生的事件做出更快的反应@特洛伊木马:我们真的不知道-但你应该做的第一件事是尝试使用我上面提供的诊断更改。然后,您就可以知道
IOUtils.toString
开销超出了读取数据所需的时间。输出是:开始从套接字1455040519365获取停止从套接字1455040524356获取,因此它与旧的相同。@特洛伊木马:对,大约是5秒。从外观上看,这基本上不是IOUtils.toString。您需要了解客户机为何花费如此长的时间发布数据(以及发布了多少数据)。