导入框架:netty-socketio
<dependency>
<groupId>com.corundumstudio.socketiogroupId>
<artifactId>netty-socketioartifactId>
<version>1.7.17version>
dependency>
简单使用代码:
@SpringBootApplication
public class SocketApplication {
public static void main(String[] args) {
SpringApplication.run(SocketApplication.class, args);
Configuration config = new Configuration();
config.setHostname("192.168.1.xxx"); // 用自己的ip
config.setPort(8888);
SocketConfig sockConfig = new SocketConfig();
//地址服用,这时候再启动不报错
sockConfig.setReuseAddress(true);
//设置使用的协议和轮询方式
config.setTransports( Transport.WEBSOCKET, Transport.POLLING);
//设置允许源
config.setOrigin(":*:");
config.setSocketConfig(sockConfig);
//允许最大帧长度
config.setMaxFramePayloadLength(1024 * 1024);
//允许下最大内容
config.setMaxHttpContentLength(1024 * 1024);
SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
public void onConnect(SocketIOClient client) {
// TODO Auto-generated method stub
String clientInfo = client.getRemoteAddress().toString();
String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));// 获取ip
System.out.println("建立客户端连接ip"+clientIp);
client.sendEvent("connected", "ip: " + clientIp);
}
});
server.addDisconnectListener(new DisconnectListener() {
public void onDisconnect(SocketIOClient client) {
String clientInfo = client.getRemoteAddress().toString();
String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));// 获取ip
System.out.println("断开客户端连接ip"+clientIp);
client.sendEvent("disconned", "ip: " + clientIp);
}
});
server.addEventListener("msg", String.class, new DataListener<String>() {
public void onData(SocketIOClient client, String data, AckRequest arg2) throws Exception {
// TODO Auto-generated method stub
String clientInfo = client.getRemoteAddress().toString();
String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));
System.out.println(clientIp + ":客户端:" + data);
client.sendEvent("msg", "客户端!!我给你返回信息了!!!!!");
}
});
server.start();
// server.stop();
}
}
导入框架:socket.io-client-java
// socket.io-client
implementation ('io.socket:socket.io-client:1.0.0') {
// excluding org.json which is provided by Android
exclude group: 'org.json', module: 'json'
}
简单使用代码:
public class MainActivity extends AppCompatActivity {
private Button btnConnect; //连接
private Button btnMessage; //消息
private Button btnDisconnect; //断开
private Socket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initSocket() {
try {
socket = IO.socket("http://192.168.1.105:8888");
socket.connect();
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("AAA", "第一次连接成功1");
}
});
socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
for (Object o : args) {
Log.e("AAA", "活动连接错误2" + o.toString());
}
}
});
socket.on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("AAA", "活动连接超时3");
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("AAA", "断开连接4");
}
});
socket.on(Socket.EVENT_CONNECTING, new Emitter.Listener() {
@Override
public void call(Object... args) {
for (Object o : args) {
Log.e("AAA", "活动连接5" + o.toString());
}
}
});
socket.on(Socket.EVENT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("AAA", "事件错误6");
}
});
socket.on("msg", new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e("AAA", "服务器发来msg:" + args[0]);
}
});
} catch (URISyntaxException e) {
e.printStackTrace();
Log.e("AAA", "抛出异常:" + e.getMessage());
}
}
private void initEvent() {
// 连接
btnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
initSocket();
}
});
// 消息
btnMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
socket.emit("msg", "哈哈哈哈哈哈");
}
});
// 断开
btnDisconnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
socket.disconnect();
}
});
}
private void initView() {
btnConnect = (Button) findViewById(R.id.btn_connect);
btnMessage = (Button) findViewById(R.id.btn_message);
btnDisconnect = (Button) findViewById(R.id.btn_disconnect);
}
}
例:
客户端发信息:
socket.emit("msg", "哈哈哈哈哈哈");
服务端监听事件的key必须是“msg”才可以:
server.addEventListener("msg", String.class, new DataListener<String>() {
public void onData(SocketIOClient client, String data, AckRequest arg2) throws Exception {
System.out.println(clientIp + ":客户端:" + data);
client.sendEvent("msg", "客户端!!我给你返回信息了!!!!!");
}
});
例:
try {
JSONObject object = new JSONObject();
object.put("name", socketManager.getDyuid());
object.put("id", salvationId);
} catch (JSONException e) {
e.printStackTrace();
Log.e("AAA", "异常:" + e.getMessage());
}
socketManager.sendMessage("messageevent", object);
例:
try {
JSONObject object = (JSONObject) args[0];
UserBean bean = gson.fromJson(object.toString(), UserBean.class);
String name= bean .getName();
} catch (JSONException e) {
e.printStackTrace();
Log.e("AAA", "成功中抛出异常" + e.getMessage());
}