我使用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内容吗?
答案 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关闭连接。