我有使用标准java.io(Socket和ServerSocket)构建的Java Client-Server应用程序。在服务器和客户端中,我使用DataInputStream
使用readUTF
和DataOutputStream
来阅读邮件,以使用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
库删除它,但它不起作用。
有没有人经历同样的事情并解决它?