1. use netty in client side to make thing easier;
2. use JsonObjectDecoder in both server side and client side, don't use DelimiterBasedFrameDecoder; 3. don't add "\r\n" at the end of the json string at both server side and client side when sending to the peer. On Monday, April 16, 2018 at 4:30:59 PM UTC+8, [email protected] wrote: > > Hi, > > I made a simple Netty Server. It receives requests from clients, read > information from database and send it back to the client. The server send > back "the answer" in JSON format. The problem is that the JSON object > sometimes bigger than 15-20 MB. The server convert the object to JSON > format correctly, but the client doesn't get the whole information. > I always get the exception on the client side: > com.google.gson.JsonSyntaxException: com.google.gson.stream. > MalformedJsonException: Unterminated string at line 1 column 44021 path $. > object > The problem is that bufferedreader only reads the first 44020 characters > of the response. (However the response is much bigger.) > Somebody can help me what is the problem with my code? > > > My initializer class: > @Override > protected void initChannel(SocketChannel c) throws Exception { > ChannelPipeline pipeline = c.pipeline(); > pipeline.addLast(new > DelimiterBasedFrameDecoder(Server.MAX_FRAME_SIZE, > Delimiters.lineDelimiter())); > pipeline.addLast(new StringDecoder(Charset.forName("UTF-8"))); > pipeline.addLast(new StringEncoder(Charset.forName("UTF-8"))); > > pipeline.addLast("handler", new ServerHandler(p2p)); > } > > Server.java sendMessage method: > private void sendMessage(ChannelHandlerContext ctx, Message msg, > boolean closeConnection) { > String msgJson = gson.toJson(msg) + "\r\n"; > ChannelFuture future = ctx.writeAndFlush(msgJson); > if (closeConnection) { > future.addListener(ChannelFutureListener.CLOSE); > } > } > > Client.java sendRequestMessage > public Message sendRequestMessage(Message msg) throws Exception { > Peer peer = getPeer(); > > Socket newClientSocket = new Socket(peer.getHost(), > peer.getPort()); > InputStream bounded = new > BoundedInputStream(newClientSocket.getInputStream(), MAX_FRAME_SIZE); > BufferedReader reader = new BufferedReader(new > InputStreamReader(bounded)); > PrintWriter writer = new > PrintWriter(newClientSocket.getOutputStream()); > > //Send request Message > writer.print(gson.toJson(msg, Message.class) + "\r\n"); > writer.flush(); > > String response = reader.readLine(); > > try { > newClientSocket.close(); > } catch (Exception e) { > logger.warn("Can't close socket: " + peer.toString(), e); > } > > > Message responseMessage = gson.fromJson(response, Message.class); > return responseMessage; > > } > > I can't figure out what is the problem with my code. > > -- You received this message because you are subscribed to the Google Groups "Netty discussions" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/netty/783bb97b-05ea-4e18-bc7b-29a3e0a64309%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
