Java.Nio - ByteBuffer在json字符串类型消息

时间:2017-05-18 06:38:03

标签: java json multithreading client-server nio

我有使用标准java.io(Socket和ServerSocket)构建的Java Client-Server应用程序。在服务器和客户端中,我使用DataInputStream使用readUTFDataOutputStream来阅读邮件,以使用writeUTF来编写邮件。我为这个应用程序使用了每个连接的线程架构。

我还有一个我现在需要添加的功能,它允许客户端与服务器建立持久连接,并始终监听要写入的服务器。我发现,使用我当前的thread-per-connection架构,我的应用程序将无法扩展,因为它在客户端打开持久连接时保留线程。

我做了一些研究,并考虑重构我的服务器以使用java.nio(SocketChannel和ServerSocketChannel)。我尝试使其与客户端兼容(因此我不需要更改客户端)。这是问题出现的原因,因为我需要从readUTF方法更改为使用ByteBuffer类来阅读消息,现在我的消息中有一个奇怪的字符。

这是我的消息在使用来自readUTF(客户端)的writeUTF(服务器)之前有效 {"command":"PUBLISH","resource":{"name":"","description":"","tags":[]}

当我将相同的消息发送到我的新服务器时,我在我的读取方法中得到了这个消息 �{"command":"PUBLISH","resource":{"name":"","description":"","tags":[]}

我的阅读方法是:

else if (clientKey.isReadable()) {
    SocketChannel clientSocket = (SocketChannel) clientKey.channel();
    ByteBuffer buffer = ByteBuffer.allocate(4096);
    clientSocket.read(buffer);
    String message = new String(buffer.array());
    Logger.debug(message);
    clientSocket.register(selector, SelectionKey.OP_WRITE);
}

这是我从客户端写消息的方式:

try (Socket echoSocket = new Socket(hostName, portNumber);
     DataOutputStream streamOut = new DataOutputStream(echoSocket.getOutputStream());) {
        streamOut.writeUTF(message.toJson());
}

toJson()只是将java对象转换为JSON字符串的方法,我使用Jackson库来做到这一点。

我尝试使用正则表达式和Normalizer库删除它,但它不起作用。

有没有人经历同样的事情并解决它?

0 个答案:

没有答案