private synchronized Socket getOrCreateSocket(boolean resend) throws NetworkIOException { if (reconnectPolicy.shouldReconnect()) { logger.debug("Reconnecting due to reconnectPolicy dictating it"); UILogger.getInstance().add("Reconnecting due to reconnectPolicy dictating it"); Utilities.close(socket); socket = null; } if (socket == null || socket.isClosed()) { try { if (proxy == null) { socket = factory.createSocket(host, port); logger.debug("Connected new socket {}", socket); UILogger.getInstance().add("Connected new socket" + socket.toString()); } else if (proxy.type() == Proxy.Type.HTTP) { TlsTunnelBuilder tunnelBuilder = new TlsTunnelBuilder(); socket = tunnelBuilder.build( (SSLSocketFactory) factory, proxy, proxyUsername, proxyPassword, host, port); logger.debug("Connected new socket through http tunnel {}", socket); UILogger.getInstance() .add("Connected new socket through http tunnel " + socket.toString()); } else { boolean success = false; Socket proxySocket = null; try { proxySocket = new Socket(proxy); proxySocket.connect(new InetSocketAddress(host, port), connectTimeout); socket = ((SSLSocketFactory) factory).createSocket(proxySocket, host, port, false); success = true; } finally { if (!success) { Utilities.close(proxySocket); } } logger.debug("Connected new socket through socks tunnel {}", socket); UILogger.getInstance() .add("Connected new socket through socks tunnel " + socket.toString()); } socket.setSoTimeout(readTimeout); socket.setKeepAlive(true); if (errorDetection) { monitorSocket(socket); } reconnectPolicy.reconnected(); logger.debug("Made a new connection to APNS"); UILogger.getInstance().add("Made a new connection to APNS"); } catch (IOException e) { logger.error("Couldn't connect to APNS server", e); UILogger.getInstance().add("Couldn't connect to APNS server" + e.toString()); // indicate to clients whether this is a resend or initial send throw new NetworkIOException(e, resend); } } return socket; }
public ApnsConnectionImpl copy() { return new ApnsConnectionImpl( factory, host, port, proxy, proxyUsername, proxyPassword, reconnectPolicy.copy(), delegate, errorDetection, threadFactory, cacheLength, autoAdjustCacheLength, readTimeout, connectTimeout); }
public void testConnection() throws NetworkIOException { ApnsConnectionImpl testConnection = null; try { testConnection = new ApnsConnectionImpl( factory, host, port, proxy, proxyUsername, proxyPassword, reconnectPolicy.copy(), delegate); final ApnsNotification notification = new EnhancedApnsNotification(0, 0, new byte[] {0}, new byte[] {0}); testConnection.sendMessage(notification); } finally { if (testConnection != null) { testConnection.close(); } } }