当我关闭一个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()
要关闭套接字吗?还是有其他方法可以实现这一点?
是的,如果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传递给方