websocket的那些事 - java client/server Hello World例項
阿新 • • 發佈:2018-12-10
此例項使用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。