Socket.D v2.5.11

应用 - 上传文件 + 元信息

</> markdown

上传文件,算是一种场景应用了。大文件(或大数据块)上传时,可进行配置优化:

  • 服务端
    • 使用临时文件分片处理方案(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();
    }
}