我有这个类打开HTTP-Server并侦听端口。回复是一个http-header和一个json对象。该类从服务器获取输入流,将其转换为字符串,过滤http标头并解析json对象。
问题是从输入流到字符串的转换大约需要3秒钟。有没有办法更快地读取输入流?
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
}
}
}
答案 0 :(得分:2)
你没有衡量自己的想法。这里:
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秒,然后发送一堆数据。)