protected boolean _receive(boolean update) throws Exception { ByteBuffer msg; Receiver receiver=server.receiver(); if(peer_addr == null && server.usePeerConnections() && (peer_addr=readPeerAddress()) != null) { recv_buf=new Buffers(2).add(ByteBuffer.allocate(Global.INT_SIZE), null); server.addConnection(peer_addr, this); return true; } if((msg=recv_buf.readLengthAndData(channel)) == null) return false; if(receiver != null) receiver.receive(peer_addr, msg); if(update) updateLastAccessed(); return true; }
protected void connect(Address dest, boolean send_local_addr) throws Exception { SocketAddress destAddr=new InetSocketAddress(((IpAddress)dest).getIpAddress(), ((IpAddress)dest).getPort()); try { if(!server.deferClientBinding()) this.channel.bind(new InetSocketAddress(server.clientBindAddress(), server.clientBindPort())); this.key=server.register(channel, SelectionKey.OP_CONNECT | SelectionKey.OP_READ, this); if(Util.connect(channel, destAddr) && channel.finishConnect()) { clearSelectionKey(SelectionKey.OP_CONNECT); this.connected=channel.isConnected(); } if(this.channel.getLocalAddress() != null && this.channel.getLocalAddress().equals(destAddr)) throw new IllegalStateException("socket's bind and connect address are the same: " + destAddr); if(send_local_addr) sendLocalAddress(server.localAddress()); } catch(Exception t) { close(); throw t; } }
conn.send(); if(key.isAcceptable()) handleAccept(key); else if(key.isConnectable()) { SocketChannel ch=(SocketChannel)key.channel(); closeConnection(conn, ex);
protected void setSocketParameters(Socket client_sock) throws SocketException { try { client_sock.setSendBufferSize(server.sendBufferSize()); } catch(IllegalArgumentException ex) { server.log().error("%s: exception setting send buffer to %d bytes: %s", server.localAddress(), server.sendBufferSize(), ex); } try { client_sock.setReceiveBufferSize(server.receiveBufferSize()); } catch(IllegalArgumentException ex) { server.log().error("%s: exception setting receive buffer to %d bytes: %s", server.localAddress(), server.receiveBufferSize(), ex); } client_sock.setKeepAlive(true); client_sock.setTcpNoDelay(server.tcpNodelay()); if(server.linger() > 0) client_sock.setSoLinger(true, server.linger()); else client_sock.setSoLinger(false, -1); }
protected void _run() { final Condition is_data_available=() -> data_available; while(running) { for(;;) { // try to receive as many msgs as possible, until no more msgs are ready or the conn is closed try { if(!_receive(false)) break; } catch(Throwable ex) { server.closeConnection(NioConnection.this, ex); state(State.done); return; } } updateLastAccessed(); // Transition to state waiting_to_terminate and wait for server.readerIdleTime() ms state(State.waiting_to_terminate); data_available=false; register(SelectionKey.OP_READ); // now we might get receive() calls again if(data_available_cond.waitFor(is_data_available, server.readerIdleTime(), TimeUnit.MILLISECONDS)) state(State.reading); else { state(State.done); return; } } }
@Override public boolean isExpired(long now) { return server.connExpireTime() > 0 && now - last_access >= server.connExpireTime(); }
if(!Arrays.equals(cookie, cookie_buf)) throw new IllegalStateException("BaseServer.NioConnection.readPeerAddress(): cookie read by " + server.localAddress() + " does not match own cookie; terminating connection"); recv_buf.add(ByteBuffer.allocate(Global.SHORT_SIZE)); break;
protected void setSocketParameters(Socket client_sock) throws SocketException { try { client_sock.setSendBufferSize(server.sendBufferSize()); } catch(IllegalArgumentException ex) { server.log().error("%s: exception setting send buffer to %d bytes: %s", server.localAddress(), server.sendBufferSize(), ex); } try { client_sock.setReceiveBufferSize(server.receiveBufferSize()); } catch(IllegalArgumentException ex) { server.log().error("%s: exception setting receive buffer to %d bytes: %s", server.localAddress(), server.receiveBufferSize(), ex); } client_sock.setKeepAlive(true); client_sock.setTcpNoDelay(server.tcpNodelay()); if(server.linger() > 0) client_sock.setSoLinger(true, server.linger()); else client_sock.setSoLinger(false, -1); }
protected void _run() { final Condition is_data_available=() -> data_available; while(running) { for(;;) { // try to receive as many msgs as possible, until no more msgs are ready or the conn is closed try { if(!_receive(false)) break; } catch(Throwable ex) { server.closeConnection(NioConnection.this, ex); state(State.done); return; } } updateLastAccessed(); // Transition to state waiting_to_terminate and wait for server.readerIdleTime() ms state(State.waiting_to_terminate); data_available=false; register(SelectionKey.OP_READ); // now we might get receive() calls again if(data_available_cond.waitFor(is_data_available, server.readerIdleTime(), TimeUnit.MILLISECONDS)) state(State.reading); else { state(State.done); return; } } }
protected void updateLastAccessed() { if(server.connExpireTime() > 0) last_access=getTimestamp(); }
if(!Arrays.equals(cookie, cookie_buf)) throw new IllegalStateException("BaseServer.NioConnection.readPeerAddress(): cookie read by " + server.localAddress() + " does not match own cookie; terminating connection"); recv_buf.add(ByteBuffer.allocate(Global.SHORT_SIZE)); break;
protected void connect(Address dest, boolean send_local_addr) throws Exception { SocketAddress destAddr=new InetSocketAddress(((IpAddress)dest).getIpAddress(), ((IpAddress)dest).getPort()); try { if(!server.deferClientBinding()) this.channel.bind(new InetSocketAddress(server.clientBindAddress(), server.clientBindPort())); this.key=server.register(channel, SelectionKey.OP_CONNECT | SelectionKey.OP_READ, this); if(Util.connect(channel, destAddr) && channel.finishConnect()) { clearSelectionKey(SelectionKey.OP_CONNECT); this.connected=channel.isConnected(); } if(this.channel.getLocalAddress() != null && this.channel.getLocalAddress().equals(destAddr)) throw new IllegalStateException("socket's bind and connect address are the same: " + destAddr); if(send_local_addr) sendLocalAddress(server.localAddress()); } catch(Exception t) { close(); throw t; } }
protected boolean _receive(boolean update) throws Exception { ByteBuffer msg; Receiver receiver=server.receiver(); if(peer_addr == null && server.usePeerConnections() && (peer_addr=readPeerAddress()) != null) { recv_buf=new Buffers(2).add(ByteBuffer.allocate(Global.INT_SIZE), null); server.addConnection(peer_addr, this); return true; } if((msg=recv_buf.readLengthAndData(channel)) == null) return false; if(receiver != null) receiver.receive(peer_addr, msg); if(update) updateLastAccessed(); return true; }
conn.send(); if(key.isAcceptable()) handleAccept(key); else if(key.isConnectable()) { SocketChannel ch=(SocketChannel)key.channel(); closeConnection(conn, ex);
@Override public boolean isExpired(long now) { return server.connExpireTime() > 0 && now - last_access >= server.connExpireTime(); }
protected void updateLastAccessed() { if(server.connExpireTime() > 0) last_access=getTimestamp(); }