Socket.IO 是一个非常棒的项目;Java 是目前应用非常广的开发语言。两者的结合也是必然的。本篇翻译自 Socket.IO-client Java 项目的 github 主页。
Socket.IO-client Java 是 Socket.IO v1.x 的 Java 客户端类库,这个类库是从 JavaScript client 移植过来的。
参见:
安装 最新的包可以从 Maven 的中心仓库获取。你将需要安装依赖。
注意:v0.6.1 之后,包名改为了 io.socket 。请确认更新了依赖配置。
Maven 在 pom.xml 中添加依赖:
1 2 3 4 5 6 7 <dependencies > <dependency > <groupId > io.socket</groupId > <artifactId > socket.io-client</artifactId > <version > 0.7.0</version > </dependency > </dependencies >
Gradle 在 build.gradle 中,给 Android Studio 添加 gradle 依赖:
1 2 3 4 compile ('io.socket:socket.io-client:0.7.0' ) { exclude group: 'org.json' , module : 'json' }
使用 Socket.IO-client Java 几乎拥有跟原生 JS 客户端相同的 api 和特性。使用 IO.socket 初始化 Socket :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 socket = IO.socket("http://localhost" ); socket.on(Socket.EVENT_CONNECT, new Emitter .Listener() { @Override public void call (Object... args) { socket.emit("foo" , "hi" ); socket.disconnect(); } }).on("event" , new Emitter .Listener() { @Override public void call (Object... args) {} }).on(Socket.EVENT_DISCONNECT, new Emitter .Listener() { @Override public void call (Object... args) {} }); socket.connect();
这个类库使用 org.json 解析和构造 JSON 字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 JSONObject obj = new JSONObject ();obj.put("hello" , "server" ); obj.put("binary" , new byte [42 ]); socket.emit("foo" , obj); socket.on("foo" , new Emitter .Listener() { @Override public void call (Object... args) { JSONObject obj = (JSONObject)args[0 ]; } });
像下面这样设置选项:
1 2 3 4 5 IO.Options opts = new IO .Options(); opts.forceNew = true ; opts.reconnection = false ; socket = IO.socket("http://localhost" , opts);
可以用 query 选项设置查询参数。请注意:如果当查询参数改变时不想复用一个缓存的 socket 实例,应该使用 forceNew 选项,可能的使用场景是如果你的应用允许用户退出,并且一个新的用户再次登录:
1 2 3 4 IO.Options opts = new IO .Options(); opts.forceNew = true ; opts.query = "auth_token=" + authToken; Socket socket = IO.socket("http://localhost" , opts);
当服务器接收到一个消息时,可以用 Ack 获取一个回调:
1 2 3 4 socket.emit("foo" , "woot" , new Ack () { @Override public void call (Object... args) {} });
反之亦然:
1 2 3 4 5 6 7 8 socket.on("foo" , new Emitter .Listener() { @Override public void call (Object... args) { Ack ack = (Ack) args[args.length - 1 ]; ack.call(); } });
SSL (HTTPS, WSS) 设置:
1 2 3 4 5 6 7 8 9 IO.setDefaultSSLContext(mySSLContext); IO.setDefaultHostnameVerifier(myHostnameVerifier); opts = new IO .Options(); opts.sslContext = mySSLContext; opts.hostnameVerifier = myHostnameVerifier; socket = IO.socket("https://localhost" , opts);
查阅 Javadoc 获取更多详情:http://socketio.github.io/socket.io-client-java/apidocs/
Transports 和 HTTP 头 可以像下面这样访问 transports 和它们的 HTTP 头:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 socket.io().on(Manager.EVENT_TRANSPORT, new Emitter .listener() { @Override public void call (Object... args) { Transport transport = (Transport)args[0 ]; transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter .Listener() { @Override public void call (Object... args) { @SuppressWarnings("unchecked") Map<String, List<String>> headers = (Map<String, List<String>>)args[0 ]; headers.put("Cookie" , Arrays.asList("foo=1;" )); } }); transport.on(Transport.EVENT_RESPONSE_HEADERS, new Emitter .Listener() { @Override public void call (Object... args) { @SuppressWarnings("unchecked") Map<String, List<String>> headers = (Map<String, List<String>>)args[0 ]; String cookie = headers.get("Set-Cookie" ).get(0 ); } }); } });
特性 这个类库支持 JS 客户端支持的所有特性,包括 events、options、upgrading transport。完全支持 Android。
License MIT