Socket.D v2.5.11

Handshake 握手信息接口

</> markdown

在 Session 的接口中,Handshake 非常重要的一个,也是会话参数(Session::param)的源来。在监听的 onOpen 事件中,可以做鉴权,可以做握手交互(反馈元信息)。可以获取:

  • 连接地址
  • 参数。由 queryString 和 metaString 解析后汇总

还可以输出元信息给对端(通过 Session::param 获取)。

public interface Handshake {
    /**
     * 协议版本
     */
    String version();

    /**
     * 获请传输地址
     *
     * @return tcp://192.168.0.1/path?user=1&path=2
     */
    URI uri();

    /**
     * 请求路径
     */
    String path();

    /**
     * 获取参数集合
     */
    Map<String, String> paramMap();

    /**
     * 获取参数
     *
     * @param name 参数名
     */
    String param(String name);

    /**
     * 获取参数或默认值
     *
     * @param name 参数名
     * @param def  默认值
     */
    String paramOrDefault(String name, String def);

    /**
     * 放置参数
     */
    Handshake paramPut(String name, String value);

    /**
     * 输出元信息
     */
    void outMeta(String name, String value);
}

应用示例:

//客户端
ClientSession clientSession1 = SocketD.createClient("sd:tcp://127.0.0.1:8602/")
    .config(c->c.metaPut("u","noear").metaPut("p","2"))
    .open();
    
       
//服务端
public class Demo {
    public static void main(String[] args) throws Throwable {
        //::启动服务端
        SocketD.createServer("sd:tcp")
                .config(c -> c.port(8602))
                .listen(new SimpleListener() {
                    @Override
                    public void onOpen(Session session) throws IOException {
                        String user = session.param("u");
                        if ("noear".equals(user) == false) { //如果不是 noear,关闭会话
                            session.close();
                        } else {
                            //还可以添加握手输出
                            session.handshake().outMeta("server-ver","1");
                        }
                    }
                })
                .start();
    }
}