本协议要求通过 Url 进行连接，连接时还可带上 MetaString。这个，就像 Http 和 Websocket（有 url ，还有 header）。UrlQueryString 和 MetaString，会成为接收端的会话参数（Session::param）。在监听器的 onOpen 事件，可对 Session 进行校验。进而实现鉴权。

### 1、客户端

* 基于 Url 签权

```javascript
//创建会话（单例）
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
        .open();
```

* 也可以使用连接元信息（MetaString）

```javascript
//创建会话（单例）
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/")
        .config(c => c.metaPut("u","noear").metaPut("p","2"))
        .open();
```


* 还可以在连接时修改元信息（MetaString）

```javascript
//创建会话（单例）
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/")
        .connectHandler(con => {
            //每次连接时，可修改元信息
            con.getConfig().metaPut("u", "noear").metaPut("p", "2");
            return con.connect();
        })
        .open();
```


### 2、服务端（以 java 为例）

服务端可以在连接时通过 outMeta 输出 MetaString，让客户端的 Session::param 获取。

```java
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();
                        }
                        
                        //还可以添加握手输出
                        session.handshake().outMeta("server-ver","1");
                    }

                    @Override
                    public void onMessage(Session session, Message message) throws IOException {
                        System.out.println(message);
                    }
                })
                .start();

        Thread.sleep(1000); //等会儿，确保服务端启动完成

        //::打开客户端会话
        //会成功
        ClientSession clientSession1 = SocketD.createClient("sd:tcp://127.0.0.1:8602/?u=noear&p=2").open();
        clientSession1.send("/demo", new StringEntity("hi"));

        //会失败
        ClientSession clientSessio2 = SocketD.createClient("sd:tcp://127.0.0.1:8602/?u=solon&p=1").open();
        clientSessio2.send("/demo2", new StringEntity("hi"));
    }
}
```