Web Socket上传文件并在同一端点上发送json

时间:2015-02-11 09:40:31

标签: java websocket jetty embedded-jetty

我使用Jetty为聊天应用程序实现JSR-356 Web套接字。 对于托管对话和发送不同的消息类型,我使用DTO对象,使用Jackson和TextDecoder从/向json序列化

public class JsonDtoCodec implements Decoder.Text<Dto>,Encoder.Text<Dto>{
        ObjectMapper om = ... //some object mapper

        @Override
        public Dto decode(String json) throws DecodeException {
            Dto dto = null;
            try {
                dto = om.readValue(json,Dto.class);
            } catch (IOException e) {
                //ToDo add Log
            }
            return dto;
        }

        @Override
        public String encode(Dto dto) throws EncodeException {
            try {
                return om.writeValueAsString(dto);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

现在,在我的端点我使用直接Dto对象:

    @ServerEndpoint(value = "/{version}/{userType}/{token}",
            decoders =JsonDtoCodec.class,
            encoders = JsonDtoCodec.class)
    public class ChatServerEndPoint {

     @OnMessage
        public void onMessage(final @PathParam("userType") String userType,
                              final @PathParam("token") String token,
                              final @PathParam("version") String version,
                              final Session session,
                              Dto dto)
                throws IOException {

               //handling all DTO related object and sending response
               Dto response = .... // create some DTO
               session.getAsyncRemote().sendObject(dto);

    } 
}

不幸的是,我需要处理通过最大100Kb大小的Web套接字上传图像文件。

我可以使用相同的端点来处理DTO和二进制数据吗? 如果不是我应该添加新的EndPoint,我应该处理两个单独的连接,一个用于二进制,一个用于Json内容吗?

1 个答案:

答案 0 :(得分:1)

你当然可以。

您将拥有2个@OnMessage注释方法。 (一个处理TEXT,另一个处理BINARY)

假设您的JsonToDtoCodec扩展Decoder.Text<Dto>,那么您的其他方法将被声明为...

@OnMessage(maxMessageSize=100000)
public void onFileUpload(final Session session, final ByteBuffer buf)
{
}

由于您说文件最大为100kb,因此将方法传递给完整的ByteBuffer就足够了。如果它更大,则可以使用InputStream方法。至于限制缓冲区的大小,maxMessageSize注释会保持理智。

注意:如果客户端尝试在二进制文件上发送超过100kb的内容,则将使用关闭代码1009: Too Big关闭连接。