今天用到websocket,希望服務(wù)器端在連接建立時(shí)獲取到客戶端的IP,看了源碼沒(méi)有找到提供的api,后來(lái)一頓百度,在stackoverflow 找到了解決方案,經(jīng)過(guò)測(cè)試可以使用,總結(jié)了一下, 下邊是代碼:
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) { Async async = session.getAsyncRemote(); // InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress"); InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress"); private static Object getFieldInstance(Object obj, String fieldPath) { String fields[] = fieldPath.split("#"); for (String field : fields) { obj = getField(obj, obj.getClass(), field); private static Object getField(Object obj, Class<?> clazz, String fieldName) { for (; clazz != Object.class; clazz = clazz.getSuperclass()) { field = clazz.getDeclaredField(fieldName); field.setAccessible(true);
調(diào)用測(cè)試:
public void onOpen(Session session) { InetSocketAddress remoteAddress = WebsocketUtil.getRemoteAddress(session); System.out.println("有新連接加入!" + remoteAddress);
輸出結(jié)果:

|