📄 isoserver.java
字号:
ServerChannel channel; serverLoop : while (!shutdown) { try { serverSocket = socketFactory != null ? socketFactory.createServerSocket(port) : (new ServerSocket (port, backlog, bindAddr)); Logger.log (new LogEvent (this, "iso-server", "listening on " + (bindAddr != null ? bindAddr + ":" : "port ") + port + (backlog > 0 ? " backlog="+backlog : "") )); while (!shutdown) { try { if (pool.getAvailableCount() <= 0) { try { serverSocket.close(); } catch (IOException e){ Logger.log (new LogEvent (this, "iso-server", e)); relax(); } for (int i=0; pool.getAvailableCount() <= 0; i++) { ISOUtil.sleep (250); if (shutdown) break serverLoop; if (i % 240 == 0) { LogEvent evt = new LogEvent (this, "warn"); evt.addMessage ( "pool exhausted " + serverSocket.toString() ); evt.addMessage (pool); Logger.log (evt); } } serverSocket = socketFactory != null ? socketFactory.createServerSocket(port) : (new ServerSocket (port, backlog, bindAddr)); } channel = (ServerChannel) clientSideChannel.clone(); channel.accept (serverSocket); if ((cnt[CONNECT]++) % 100 == 0) purgeChannels (); WeakReference wr = new WeakReference (channel); channels.put (channel.getName(), wr); channels.put (LAST, wr); setChanged (); notifyObservers (channel); pool.execute (createSession(channel)); } catch (SocketException e) { if (!shutdown) Logger.log (new LogEvent (this, "iso-server", e)); } catch (IOException e) { Logger.log (new LogEvent (this, "iso-server", e)); relax(); } } } catch (Throwable e) { Logger.log (new LogEvent (this, "iso-server", e)); relax(); } } } private void relax() { try { Thread.sleep (5000); } catch (InterruptedException e) { } } /** * associates this ISOServer with a name using NameRegistrar * @param name name to register * @see NameRegistrar */ public void setName (String name) { this.name = name; NameRegistrar.register ("server."+name, this); } /** * @return ISOMUX instance with given name. * @throws NameRegistrar.NotFoundException; * @see NameRegistrar */ public static ISOServer getServer (String name) throws NameRegistrar.NotFoundException { return (ISOServer) NameRegistrar.get ("server."+name); } /** * @return this ISOServer's name ("" if no name was set) */ public String getName() { return this.name; } public void setLogger (Logger logger, String realm) { this.logger = logger; this.realm = realm; this.realmChannel = realm + ".channel"; } public String getRealm () { return realm; } public Logger getLogger() { return logger; } public void update(Observable o, Object arg) { setChanged (); notifyObservers (arg); } /** * Gets the ISOClientSocketFactory (may be null) * @see ISOClientSocketFactory * @since 1.3.3 */ public ISOServerSocketFactory getSocketFactory() { return socketFactory; } /** * Sets the specified Socket Factory to create sockets * @param socketFactory the ISOClientSocketFactory * @see ISOClientSocketFactory * @since 1.3.3 */ public void setSocketFactory(ISOServerSocketFactory socketFactory) { this.socketFactory = socketFactory; } public int getPort () { return port; } public void resetCounters () { cnt = new int[SIZEOF_CNT]; } /** * @return number of connections accepted by this server */ public int getConnectionCount () { return cnt[CONNECT]; } // ThreadPoolMBean implementation (delegate calls to pool) public int getJobCount () { return pool.getJobCount(); } public int getPoolSize () { return pool.getPoolSize(); } public int getMaxPoolSize () { return pool.getMaxPoolSize(); } public int getIdleCount() { return pool.getIdleCount(); } public int getPendingCount () { return pool.getPendingCount(); } /** * @return most recently connected ISOChannel or null */ public ISOChannel getLastConnectedISOChannel () { return getISOChannel (LAST); } /** * @return ISOChannel under the given name */ public ISOChannel getISOChannel (String name) { WeakReference ref = (WeakReference) channels.get (name); if (ref != null) return (ISOChannel) ref.get (); return null; } public void setConfiguration (Configuration cfg) throws ConfigurationException { this.cfg = cfg; allow = cfg.getAll ("allow"); backlog = cfg.getInt ("backlog", 0); ignoreISOExceptions = cfg.getBoolean("ignore-iso-exceptions"); String ip = cfg.get ("bind-address", null); if (ip != null) { try { bindAddr = InetAddress.getByName (ip); } catch (UnknownHostException e) { throw new ConfigurationException ("Invalid bind-address " + ip, e); } } if (socketFactory != this && socketFactory instanceof Configurable) { ((Configurable)socketFactory).setConfiguration (cfg); } } public String getISOChannelNames () { StringBuffer sb = new StringBuffer (); Iterator iter = channels.entrySet().iterator(); for (int i=0; iter.hasNext(); i++) { Map.Entry entry = (Map.Entry) iter.next(); WeakReference ref = (WeakReference) entry.getValue(); ISOChannel c = (ISOChannel) ref.get (); if (c != null && !LAST.equals (entry.getKey())) { if (i > 0) sb.append (' '); sb.append (entry.getKey()); } } return sb.toString(); } public String getCountersAsString () { StringBuffer sb = new StringBuffer (); Iterator iter = channels.entrySet().iterator(); int[] cnt = new int[2]; int connectedChannels = 0; for (int i=0; iter.hasNext(); i++) { Map.Entry entry = (Map.Entry) iter.next(); WeakReference ref = (WeakReference) entry.getValue(); ISOChannel c = (ISOChannel) ref.get (); if (c != null && !LAST.equals (entry.getKey()) && c.isConnected()) { connectedChannels++; if (c instanceof BaseChannel) { int[] cc = ((BaseChannel)c).getCounters(); cnt[0] += cc[ISOChannel.RX]; cnt[1] += cc[ISOChannel.TX]; } } } sb.append ("connected="+connectedChannels); sb.append (", rx=" + Integer.toString(cnt[0])); sb.append (", tx=" + Integer.toString(cnt[1])); return sb.toString(); } public String getCountersAsString (String isoChannelName) { ISOChannel channel = getISOChannel(isoChannelName); StringBuffer sb = new StringBuffer(); if (channel instanceof BaseChannel) { int[] counters = ((BaseChannel)channel).getCounters(); append (sb, "rx=", counters[ISOChannel.RX]); append (sb, ", tx=", counters[ISOChannel.TX]); append (sb, ", connects=", counters[ISOChannel.CONNECT]); } return sb.toString(); } public void dump (PrintStream p, String indent) { p.println (indent + getCountersAsString()); Iterator iter = channels.entrySet().iterator(); String inner = indent + " "; for (int i=0; iter.hasNext(); i++) { Map.Entry entry = (Map.Entry) iter.next(); WeakReference ref = (WeakReference) entry.getValue(); ISOChannel c = (ISOChannel) ref.get (); if (c != null && !LAST.equals (entry.getKey()) && c.isConnected()) { if (c instanceof BaseChannel) { StringBuffer sb = new StringBuffer (); int[] cc = ((BaseChannel)c).getCounters(); sb.append (inner); sb.append (entry.getKey()); sb.append (": rx="); sb.append (Integer.toString (cc[ISOChannel.RX])); sb.append (", tx="); sb.append (Integer.toString (cc[ISOChannel.TX])); p.println (sb.toString()); } } } } private void append (StringBuffer sb, String name, int value) { sb.append (name); sb.append (value); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -