今天用到websocket,希望服務(wù)器端在連接建立時(shí)獲取到客戶(hù)端的IP,看了源碼沒(méi)有找到提供的api,后來(lái)一頓百度,在stackoverflow 找到了解決方案,經(jīng)過(guò)測試可以使用,總結了一下, 下邊是代碼:
- import java.lang.reflect.Field;
- import java.net.InetSocketAddress;
- import javax.websocket.RemoteEndpoint.Async;
- import javax.websocket.Session;
- public class WebsocketUtil {
- public static InetSocketAddress getRemoteAddress(Session session) {
- if (session == null) {
- return null;
- }
- Async async = session.getAsyncRemote();
- //在Tomcat 8.0.x版本有效
- // InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
- //在Tomcat 8.5以上版本有效
- InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
- return addr;
- }
- private static Object getFieldInstance(Object obj, String fieldPath) {
- String fields[] = fieldPath.split("#");
- for (String field : fields) {
- obj = getField(obj, obj.getClass(), field);
- if (obj == null) {
- return null;
- }
- }
- return obj;
- }
- private static Object getField(Object obj, Class<?> clazz, String fieldName) {
- for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
- try {
- Field field;
- field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
- return field.get(obj);
- } catch (Exception e) {
- }
- }
- return null;
- }
- }
調用測試:
- /**
- * 連接建立成功調用的方法*/
- @OnOpen
- public void onOpen(Session session) {
- InetSocketAddress remoteAddress = WebsocketUtil.getRemoteAddress(session);
- System.out.println("有新連接加入!" + remoteAddress);
- }
輸出結果:

聯(lián)系客服