当前位置: 首页 > 知识库问答 >
问题:

JsonWriter.close()关闭Socket?

柳英资
2023-03-14

当我关闭一个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();

客户端代码(我知道它不是这样工作的-读取数据它不正确地显示在文本字段中,但有东西正在关闭连接,这是我不想首先发生的事情):

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;

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

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

[16:04:56][Thread-10/WARN]:java。网SocketException:Socket closed[16:04:56][Thread-10/WARN]:在java上。网SocketOutputStream。socketWrite(SocketOutputStream.java:118)[16:04:56][Thread-10/WARN]:在java。网SocketOutputStream。write(SocketOutputStream.java:155)[16:04:56][Thread-10/WARN]:在java上。伊奥。ObjectOutputStream$BlockDataOutputStream。drain(ObjectOutputStream.java:1877)[16:04:56][Thread-10/WARN]:在java。伊奥。ObjectOutputStream$BlockDataOutputStream。setBlockDataMode(ObjectOutputStream.java:1786)[16:04:56][Thread-10/WARN]:在java。伊奥。ObjectOutputStream。writeNonProxyDesc(ObjectOutputStream.java:1286)[16:04:56][Thread-10/WARN]:在java上。伊奥。ObjectOutputStream。writeClassDesc(ObjectOutputStream.java:1231)[16:04:56][Thread-10/WARN]:在java上。伊奥。ObjectOutputStream。writeOrdinaryObject(ObjectOutputStream.java:1427)[16:04:56][Thread-10/WARN]:在java上。伊奥。ObjectOutputStream。WriteObject 0(ObjectOutputStream.java:1178)[16:04:56][Thread-10/WARN]:在java上。伊奥。ObjectOutputStream。writeFatalException(ObjectOutputStream.java:1577)[16:04:56][Thread-10/WARN]:在java。伊奥。ObjectOutputStream。writeObject(ObjectOutputStream.java:351)[16:04:56][Thread-10/WARN]:位于de.freakyonline。乌克内普卢金。UCOnePluginServer$ClientHandler。运行(UCOnePluginServer.java:112)[16:04:56][Thread-10/WARN]:在java上运行。朗。丝线。运行(Thread.java:745)

客户端:

JAVA网SocketException:套接字在java上关闭。网SocketInputStream。java上的socketRead0(本机方法)。网SocketInputStream。java上的socketRead(SocketInputStream.java:116)。网SocketInputStream。在java上阅读(SocketInputStream.java:170)。网SocketInputStream。在java上阅读(SocketInputStream.java:141)。网SocketInputStream。在java上阅读(SocketInputStream.java:223)。伊奥。ObjectInputStream$PeekInputStream。java上的peek(ObjectInputStream.java:2321)。伊奥。ObjectInputStream$BlockDataInputStream。java上的peek(ObjectInputStream.java:2614)。伊奥。ObjectInputStream$BlockDataInputStream。java上的peekByte(ObjectInputStream.java:2624)。伊奥。ObjectInputStream。java上的readObject0(ObjectInputStream.java:1321)。伊奥。ObjectInputStream。位于de.freakyonline的readObject(ObjectInputStream.java:373)。尤肯。遥远的在java上运行(Remote.java:53)。朗。丝线。运行(Thread.java:745)

是否有可能阻止jsonWriter。close()要关闭套接字吗?还是有其他方法可以实现这一点?

共有1个答案

云曦之
2023-03-14

是的,如果close()aJsonWriter,则底层套接字也会关闭。

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

close()的目的是刷新任何缓冲区并释放任何底层资源(输出流、文件句柄、套接字等),但既然你明确不想那样做,你就不需要这么做。

 类似资料:
  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

  • 问题内容: 我已经实现了 使用资源的自定义 java.util.Iterator ,该资源应在使用方法的最后释放。该资源可以是 java.sql.ResultSet , java.io.InputStream 等。 使用此迭代器的某些外部库可能不知道必须关闭它。例如: 在这种情况下,有没有办法关闭此迭代器? 更新: 非常感谢您提供当前的答案。我给每个人一个(+1)。当 hasNext() 返回fa

  • 问题内容: 今天,我第一次在本地计算机上启动Redis,然后在关闭Rails应用程序后关闭了所有终端窗口。一个小时后,我再次启动Rails应用程序,并执行以下操作来启动Redis服务器 但是,它告诉我 因此,即使关闭了Mac上的终端窗口,我也认为它仍在运行其较早的实例。 看着这个页面http://redis.io/commands/shutdown,我试图运行 在终端窗口中,但我收到此响应 因此,

  • 我对ExecutorService的javadoc#shutdown方法感到困惑。这些说法不矛盾吗? 启动有序关闭,其中执行以前提交的任务,但不接受新任务。此方法不会等待以前提交的任务完成执行。使用waitTersion执行此操作。 如果它能有序地关闭之前提交的任务,那么它怎么能等它们完成执行呢?

  • 我已经实现了HikariCP,它工作得很好,我现在计划优雅地关闭我的应用程序,我想让HikariCP正确地关闭数据库连接,而不仅仅是关闭java应用程序。我在谷歌上阅读,我可以看到HikariDataSource应该有一个封闭的方法。。。。但事实上,我看不到它的可用性: 在Eclipse中,如果我尝试ds。close()。。。Eclipse没有显示“close”作为HikariDataSource

  • 问题内容: 我试图将我的应用程序中较大且经常使用的部分重构为单独的方法,以使其易于维护。 其中一些方法要求用户输入并进行输入验证,因此我使用了Scanner和System.in,但是当我关闭Scanner时,我也关闭了System.in。 所以我的问题是,我只能通过用CloseShieldInputStream屏蔽System.in来防止System.in关闭,还是应该开始将Scanner传递给方