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()
aJsonWriter
,则底层套接字也会关闭
为了避免套接字被关闭,不要关闭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;