应用 - 上传文件 + 元信息
上传文件,算是一种场景应用了。大文件(或大数据块)上传时,可进行配置优化:
- 服务端
- 使用临时文件分片处理方案(FragmentHandlerTempfile)
- 处理完成后,执行释放动作 message.release()
- 客户端
- 使用更小的分片大小(比如 1M)
1、客户端
public class Demo {
public static void main(String[] args) throws Throwable {
//::打开客户端会话(使用更小的分片大小,可以节点内存)
ClientSession clientSession = SocketD.createClient("sd:tcp://127.0.0.1:8602/?u=a&p=2")
.config(c -> c.fragmentSize(1024 * 1024)) //1m
.open();
//发送 + 元信息
clientSession.send("/demo", new StringEntity("{user:'noear'}").metaPut("Trace-Id", UUID.randomUUID().toString()));
//发送文件
clientSession.send("/demo2", new FileEntity(new File("/data/user.jpg")));
}
}
2、服务端
public class Demo {
public static void main(String[] args) throws Throwable {
//::启动服务端
SocketD.createServer("sd:tcp")
.config(c -> c.port(8602).fragmentHandler(new FragmentHandlerTempfile()))
.listen(new SimpleListener(){
@Override
public void onMessage(Session session, Message message) throws IOException {
String fileName = message.meta(EntityMetas.META_DATA_DISPOSITION_FILENAME);
if (fileName != null) {
File fileNew = new File("/data/upload/user.jpg");
fileNew.createNewFile();
//使用通道机制,性能更好
try (FileChannel fileChannel = new FileOutputStream(fileNew).getChannel()) {
fileChannel.write(message.data());
} finally {
//使用 FragmentHandlerTempfile 时,须对消息做资源释放(就是删除临时文件)
message.release();
}
}else{
System.out.println(message);
}
}
})
.start();
}
}