Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
JsonWriter.close()关闭套接字?_Json_Sockets_Java 8 - Fatal编程技术网

JsonWriter.close()关闭套接字?

JsonWriter.close()关闭套接字?,json,sockets,java-8,Json,Sockets,Java 8,当我关闭JsonWriter时,它是否也会关闭套接字?因为我不想那样。我希望服务器保持连接,以便向其发送命令。就像我目前正在编写的一个(命令)是“getplayers”。客户端发送一个带有文本(字符串)“getplayers”的对象。然后服务器在命令之间切换,并执行客户端发送的任何命令。如果我的JsonWriter(发送playerList)在完成“getplayers”后关闭套接字,但这不是我想要的 服务器代码: switch (command) { case "getplayers"

当我关闭
JsonWriter
时,它是否也会关闭套接字?因为我不想那样。我希望服务器保持连接,以便向其发送命令。就像我目前正在编写的一个(命令)是“getplayers”。客户端发送一个带有文本(字符串)“getplayers”的对象。然后服务器在命令之间切换,并执行客户端发送的任何命令。如果我的
JsonWriter
(发送
playerList
)在完成“getplayers”后关闭套接字,但这不是我想要的

服务器代码:

switch (command) {
    case "getplayers":
        qryFullPlayerTable = mySQLConnection.prepareStatement("SELECT pid,uuid,nickname,firstjoined,lastquit FROM PlayerList");
        result = qryFullPlayerTable.executeQuery();

        clientHandlerOut.writeObject("getplayers");

        final JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(clientHandlerOut));
        resultSetToJsonArrayStream(result, jsonWriter);
        jsonWriter.close();
客户端代码(我知道它不是这样工作的-读取文本字段中未正确显示的数据,但有东西正在关闭连接,这是我不希望首先发生的):

客户端在其中检查命令的文本字段,如果是“getplayers”,则向服务器发送“getplayers”。换句话说,服务器只是监听命令,然后发送playerdata。它是一个clientHandler,因此它应该保持连接,直到客户端断开连接

我在服务器上遇到的错误:

[16:04:56][Thread-10/WARN]:java.net.SocketException:套接字已关闭 [16:04:56][Thread-10/WARN]:在 SocketOutputStream.socketWrite(SocketOutputStream.java:118) [16:04:56][Thread-10/WARN]:在 java.net.SocketOutputStream.write(SocketOutputStream.java:155) [16:04:56][Thread-10/WARN]:在 ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877) [16:04:56][Thread-10/WARN]:在 ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1286) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1231) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1427) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1178) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1577) [16:04:56][Thread-10/WARN]:在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351) [16:04:56][Thread-10/WARN]:在 de.freakyonline.uconeplugin.UCOnePluginServer$ClientHandler.run(UCOnePluginServer.java:112) [16:04:56][Thread-10/WARN]:在 run(Thread.java:745)

在客户端:

java.net.SocketException:套接字在关闭 位于的java.net.SocketInputStream.socketRead0(本机方法) SocketInputStream.socketRead(SocketInputStream.java:116)位于 java.net.SocketInputStream.read(SocketInputStream.java:170)位于 java.net.SocketInputStream.read(SocketInputStream.java:141)位于 java.net.SocketInputStream.read(SocketInputStream.java:223)位于 ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2321) 在 ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2614) 在 ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2624) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) 位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 在de.freakyonline.ucone.Remote.run(Remote.java:53)处 run(Thread.java:745)

是否有可能阻止
jsonWriter.close()
关闭套接字?或者有其他方法来实现这一点吗?

是的,如果您
close()
a
JsonWriter
,则底层套接字也会关闭

为了避免套接字被关闭,不要关闭writer,而是让它被垃圾收集。尽管您可能希望确保所有内容都是
flush()
'd

close()
的目的是刷新任何缓冲区并释放任何底层资源(输出流、文件句柄、套接字等等),但由于您明确不希望这样做,因此不需要这样做

switch(command) {
    case "getplayers": 
      /*while((obj2=in.readObject()) != null) {
            currentFromServer = obj2.toString().toLowerCase();

            if (currentFromServer.equalsIgnoreCase("done")) {
                consoleOneTextArea.appendText("This is finished. Have fun!\n");
                break;
            }

            consoleOneTextArea.appendText(currentFromServer + "\n");
      */JsonReader jsonReader = new JsonReader(new InputStreamReader(in, "UTF-8"));

        try {
            while(jsonReader.hasNext()){
                JsonToken nextToken = jsonReader.peek();
                System.out.println(nextToken);

                if(JsonToken.BEGIN_OBJECT.equals(nextToken)){

                jsonReader.beginObject();

                } else if(JsonToken.NAME.equals(nextToken)){
                    String name  =  jsonReader.nextName();

                    switch(name) {
                        case "pid":
                            System.out.println("pid: " + jsonReader.nextInt());
                        default:
                            System.out.println("TODO: " + name);
                    }
                }

        jsonReader.close();

        break;