Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IOUtils.toString需要很长时间_Java_Json_Inputstream_Httpserver - Fatal编程技术网

Java IOUtils.toString需要很长时间

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

我有一个类,它打开一个HTTP服务器并监听一个端口。回复是一个http头加上一个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
    }

}

}

你不是在衡量你认为自己是什么。在这里:

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。您需要了解客户机为何花费如此长的时间发布数据(以及发布了多少数据)。