gpt4 book ai didi

java - 从套接字流读取时 Genson 的行为非常奇怪

转载 作者:行者123 更新时间:2023-11-30 05:52:09 24 4
gpt4 key购买 nike

我正在尝试使用 Genson 库在服务器和客户端之间执行通信。我检测到以下问题:尝试向服务器发送消息时,当服务器上的 genson 尝试读取消息时,我的应用程序停止运行。

同时,如果我关闭客户端,消息将被完美读取和处理。我认为这是僵局,但不确定。

原生Java序列化不存在这样的问题。

这是我的服务器:

import com.owlike.genson.Genson;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;

public class Server {
public static void main(String[] args) throws IOException {
Genson genson = new Genson();

try (ServerSocket server = new ServerSocket(9991)) {
try (Socket socket = server.accept()) {
int[] loc = genson.deserialize(socket.getInputStream(), int[].class);
System.out.println("Server: " + Arrays.toString(loc));
genson.serialize(loc, socket.getOutputStream());
}
}
}
}

这是客户端:

import com.owlike.genson.Genson;

import java.io.IOException;
import java.net.Socket;
import java.util.Arrays;

public class Client {
public static void main(String[] args) throws IOException {
Genson genson = new Genson();

try (Socket socket = new Socket("localhost", 9991)) {
genson.serialize(new int[] {1, 2, 3}, socket.getOutputStream());
int[] loc = genson.deserialize(socket.getInputStream(), int[].class);
System.out.println("Client: " + Arrays.toString(loc));
}
}
}

我非常感谢您对这个问题的任何帮助。提前致谢。

<小时/>

编辑:这真的很奇怪。我做了一些额外的测试,这是我得到的:

附加类(class):

import com.owlike.genson.annotation.JsonProperty;

import java.io.Serializable;

public class Tester implements Serializable {
public static final Tester TEST = new Tester(Math.E);

private double val = Math.PI;

public Tester(@JsonProperty("val") double val) {
this.val = val;
}

public Tester() {}

public String toString() {
return "" + val;
}
}

在客户端请求中写入genson.serialize(Tester.TEST, socket.getOutputStream())后,我得到了同样奇怪的结果。但是编写了 genson.serialize(new Tester(Double.NaN), socket.getOutputStream()) 后,结果是 expexted 的结果。

此外,如果我将 Tester 类中的唯一字段定义为 int[] 类型,那么它仅适用于 null 值新的int[0]

除此之外,如果我尝试序列化并传输 0..9 范围内的整数,我会观察到以下行为:同样奇怪的事情,除了当我关闭客户端时,服务器始终显示 0 值。

此外,对于像 Double.NaNDouble.POSITIVE_INFINITYInteger.MAX_VALUE 和类似的常量来说,没有什么奇怪的(一切按预期工作)。

对于这些附加测试,Genson 类定义如下:

Genson genson = new GensonBuilder()
.useMethods(false)
.setFieldFilter(VisibilityFilter.PRIVATE)
.create();

请注意,当使用流对文件进行 Ser/Deser 或从文件中进行 Ser/Deser 时,不存在此类问题:

import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
import com.owlike.genson.reflect.VisibilityFilter;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileTest {
private static final String FILENAME = "test.json";

public static void main(String[] args) throws IOException {
Genson genson = new GensonBuilder()
.useMethods(false)
.setFieldFilter(VisibilityFilter.PRIVATE)
.useIndentation(true)
.create();

try (OutputStream stream = new FileOutputStream(FILENAME)) {
genson.serialize(Tester.TEST, stream);
}

try (InputStream stream = new FileInputStream(FILENAME)) {
System.out.println(genson.deserialize(stream, Tester.class));
}
}
}

最佳答案

看来这一直是我的错误。我忘记了套接字的流无法关闭(除非您也想关闭套接字)。因此,在这种情况下,Server 尝试从 InputStream 获取尽可能多的数据,但它无法消耗所有流(因为它始终打开并且可以发送数据)随时从客户处获得)。因此,服务器基本上卡住等待数据,但没有更多数据到来。结果我们就遇到了上面描述的情况。

解决方案是指定某种协议(protocol)来表示查询大小,以便服务器可以知道它应该消耗多少数据。请参阅this回答以获取更多详细信息。

关于java - 从套接字流读取时 Genson 的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com