此实例使用java netty-socketio进行服务端开发, 客户端使用socket.io-client-java, 一般网上实例客户端都使用socket.io-client,连netty-socketio自带的Demo project也是使用的socket.io-client, 毕竟socket.io-client-java是参照socket.io-client移植过来的,费话不多说,上菜 #_#。
一、不带Namespace实例
- 引入maven jar
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>io.socket</groupId>
<artifactId>socket.io-client</artifactId>
<version>0.9.0</version>
</dependency>
<!-- socket.io-client support -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
- 服务端CODE
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.protocol.Packet;
import com.corundumstudio.socketio.protocol.PacketType;
import com.itdreamer.util.DataUtil;
import io.socket.client.Socket;
public class Server {
public static void main(String[] args) throws InterruptedException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(8090);
final SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
System.out.println(DataUtil.getCurrentDataTime() + ":client connection, sessionId:" + client.getSessionId());
Packet packet = new Packet(PacketType.MESSAGE);
packet.setData("hello client,Welcome to connect!");
client.send(packet);
}
});
server.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener<String>() {
@Override
public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {
System.out.println(DataUtil.getCurrentDataTime() + ":client data:" + data);
server.getBroadcastOperations().sendEvent(Socket.EVENT_MESSAGE, "my too client!");
}
});
server.start();
Thread.sleep(Integer.MAX_VALUE);
server.stop();
}
}
- 客户端CODE
import java.net.URISyntaxException;
import java.util.Scanner;
import com.itdreamer.util.DataUtil;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class Client {
public static void main(String[] args) throws URISyntaxException, InterruptedException {
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
//失败重连的时间间隔
options.reconnectionDelay = 1000;
//连接超时时间(ms)
options.timeout = 500;
final Socket socket = IO.socket("http://localhost:8090", options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(DataUtil.getCurrentDataTime() + ":client connect! ");
socket.send("hello server, my name is client");
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(DataUtil.getCurrentDataTime() + ":client disconnect!");
}
});
socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {
@Override
public void call(Object... args) {
for (Object obj : args) {
System.out.println(DataUtil.getCurrentDataTime() + ":receive server message="+obj);
}
}
});
socket.connect();
System.out.println(DataUtil.getCurrentDataTime() + ":client console input......");
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String message = sc.next();
System.out.println(DataUtil.getCurrentDataTime() + ":client console send data="+message);
socket.send(message);
}
}
}
- 支持工具CODE
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataUtil {
public static String FORMAT_YMD_HMS = "yyyy-MM-dd HH:mm:ss SS";
public static String getCurrentDataTime() {
SimpleDateFormat df = new SimpleDateFormat(FORMAT_YMD_HMS);
return df.format(new Date());
}
}
二、带Namespace实例
** 引入maven jar 与 支持工具CODE同上 **
- 服务端CODE
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.protocol.Packet;
import com.corundumstudio.socketio.protocol.PacketType;
import io.socket.client.Socket;
public class NamespaceServer {
public static void main(String[] args) throws InterruptedException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(8090);
final SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
System.out.println("receive client onConnect");
Packet packet = new Packet(PacketType.MESSAGE);
packet.setData("hello client,Welcome to connect!");
client.send(packet);
}
});
// 设定Namespace
final SocketIONamespace chat1namespace = server.addNamespace("/room");
chat1namespace.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener<String>() {
@Override
public void onData(SocketIOClient client, String data, AckRequest ackRequest) {
System.out.println("receive client data="+data);
client.sendEvent(Socket.EVENT_MESSAGE, "my too client!");
}
});
server.start();
Thread.sleep(Integer.MAX_VALUE);
server.stop();
}
}
- 客户端CODE
import java.net.URISyntaxException;
import java.util.Scanner;
import com.itdreamer.util.DataUtil;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class NamespaceClient {
public static void main(String[] args) throws URISyntaxException, InterruptedException {
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
//失败重连的时间间隔
options.reconnectionDelay = 1000;
//连接超时时间(ms)
options.timeout = 500;
// ## 连接到指定的聊天室 【/room】########
final Socket socket = IO.socket("http://localhost:8090/room", options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(DataUtil.getCurrentDataTime() + ":client connect! ");
socket.send("hello server, my name is client");
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println(DataUtil.getCurrentDataTime() + ":client disconnect!");
}
});
socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {
@Override
public void call(Object... args) {
for (Object obj : args) {
System.out.println(DataUtil.getCurrentDataTime() + ":receive server message="+obj);
}
}
});
socket.connect();
System.out.println(DataUtil.getCurrentDataTime() + ":client console input......");
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String message = sc.next();
System.out.println(DataUtil.getCurrentDataTime() + ":client console send data="+message);
socket.send(message);
}
}
}
……注意
此实例socket.io-client-java版本使用的为 0.9.0,一开始使用的为最新版1.0.0,一直有不能通信的问题,
【没细看官网说明】
Socket.IO Server 1.x suppport
The current version of socket.io-client-java doesn't support socket.io server 1.x. Please use socket.io-client-java 0.9.x for that instead.
当前版本的socket.io-client-java不支持socket.io服务器1.x. 请改用socket.io-client-java 0.9.x。