basechannel.java

来自「java pos,你可以直接编译运行,」· Java 代码 · 共 846 行 · 第 1/2 页

JAVA
846
字号
     */    public void send (ISOMsg m)         throws IOException, ISOException, VetoException    {        LogEvent evt = new LogEvent (this, "send");        evt.addMessage (m);        try {            if (!isConnected())                throw new ISOException ("unconnected ISOChannel");            m.setDirection(ISOMsg.OUTGOING);            m = applyOutgoingFilters (m, evt);            m.setDirection(ISOMsg.OUTGOING); // filter may have drop this info            m.setPackager (getDynamicPackager(m));            byte[] b = m.pack();            synchronized (serverOut) {                sendMessageLength(b.length + getHeaderLength());                sendMessageHeader(m, b.length);                sendMessage (b, 0, b.length);                sendMessageTrailler(m, b);                serverOut.flush ();            }            cnt[TX]++;            setChanged();            notifyObservers(m);        } catch (VetoException e) {            evt.addMessage (e);            throw e;        } catch (ISOException e) {            evt.addMessage (e);            throw e;        } catch (IOException e) {            evt.addMessage (e);            throw e;        } catch (Exception e) {            evt.addMessage (e);            throw new ISOException ("unexpected exception", e);        } finally {            Logger.log (evt);        }    }    protected boolean isRejected(byte[] b) {        // VAP Header support - see VAPChannel        return false;    }    protected boolean shouldIgnore (byte[] b) {        // VAP Header support - see VAPChannel        return false;    }    protected ISOMsg createMsg () {        return new ISOMsg();    }	    /**     * Reads in a message header.     *     * @param hLen The Length og the reader to read     * @return The header bytes that were read in     */    protected byte[] readHeader(int hLen) throws IOException {        byte[] header = new byte[hLen];        serverIn.readFully(header, 0, hLen);        return header;    }    /**     * Waits and receive an ISOMsg over the TCP/IP session     * @return the Message received     * @exception IOException     * @exception ISOException     */    public ISOMsg receive() throws IOException, ISOException {        byte[] b=null;        byte[] header=null;        LogEvent evt = new LogEvent (this, "receive");        ISOMsg m = createMsg ();        m.setSource (this);        try {            if (!isConnected())                throw new ISOException ("unconnected ISOChannel");            synchronized (serverIn) {                int len  = getMessageLength();                int hLen = getHeaderLength();                if (len == -1) {                    if (hLen > 0) {                        header = readHeader(hLen);                    }                    b = streamReceive();                }                else if (len > 0 && len <= 10000) {                    if (hLen > 0) {                        // ignore message header (TPDU)                        // Note header length is not necessarily equal to hLen (see VAPChannel)                        header = readHeader(hLen);                        len -= header.length;                    }                    b = new byte[len];                    serverIn.readFully(b, 0, len);                    getMessageTrailler();                }                else                    throw new ISOException(                        "receive length " +len + " seems strange");            }            m.setPackager (getDynamicPackager(b));            m.setHeader (getDynamicHeader(header));            if (b.length > 0 && !shouldIgnore (header))  // Ignore NULL messages                m.unpack (b);            m.setDirection(ISOMsg.INCOMING);            m = applyIncomingFilters (m, header, b, evt);            m.setDirection(ISOMsg.INCOMING);            evt.addMessage (m);            cnt[RX]++;            setChanged();            notifyObservers(m);        } catch (ISOException e) {            evt.addMessage (e);            if (header != null) {                evt.addMessage ("--- header ---");                evt.addMessage (ISOUtil.hexdump (header));            }            if (b != null) {                evt.addMessage ("--- data ---");                evt.addMessage (ISOUtil.hexdump (b));            }            throw e;        } catch (EOFException e) {            if (socket != null)                socket.close ();            evt.addMessage ("<peer-disconnect/>");            throw e;        } catch (InterruptedIOException e) {            if (socket != null)                socket.close ();            evt.addMessage ("<io-timeout/>");            throw e;        } catch (IOException e) {             if (socket != null)                socket.close ();            if (usable)                 evt.addMessage (e);            throw e;        } catch (Exception e) {             evt.addMessage (m);            evt.addMessage (e);            throw new ISOException ("unexpected exception", e);        } finally {            Logger.log (evt);        }        return m;    }    /**     * Low level receive     * @param b byte array     * @exception IOException     */    public int getBytes (byte[] b) throws IOException {        return serverIn.read (b);    }    /**     * disconnects the TCP/IP session. The instance is ready for     * a reconnection. There is no need to create a new ISOChannel<br>     * @exception IOException     */    public void disconnect () throws IOException {        LogEvent evt = new LogEvent (this, "disconnect");        if (serverSocket != null)             evt.addMessage ("local port "+serverSocket.getLocalPort()                +" remote host "+serverSocket.getInetAddress());        else            evt.addMessage (host+":"+port);        try {            usable = false;            setChanged();            notifyObservers();            if (serverIn != null) {                try {                    serverIn.close();                } catch (IOException ex) { evt.addMessage (ex); }                serverIn  = null;            }            if (serverOut != null) {                try {                    serverOut.close();                } catch (IOException ex) { evt.addMessage (ex); }                serverOut = null;            }            if (socket != null) {                try {                    socket.setSoLinger (true, 0);                } catch (SocketException e) {                    // safe to ignore - can be closed already                }                socket.close ();            }            Logger.log (evt);        } catch (IOException e) {            evt.addMessage (e);            Logger.log (evt);            throw e;        }        socket = null;    }       /**     * Issues a disconnect followed by a connect     * @exception IOException     */    public void reconnect() throws IOException {        disconnect();        connect();    }    public void setLogger (Logger logger, String realm) {        this.logger = logger;        this.realm  = realm;        if (originalRealm == null)            originalRealm = realm;    }    public String getRealm () {        return realm;    }    public Logger getLogger() {        return logger;    }    public String getOriginalRealm() {        return originalRealm == null ?             this.getClass().getName() : originalRealm;    }    /**     * associates this ISOChannel with a name using NameRegistrar     * @param name name to register     * @see NameRegistrar     */    public void setName (String name) {        this.name = name;        NameRegistrar.register ("channel."+name, this);    }    /**     * @return this ISOChannel's name ("" if no name was set)     */    public String getName() {        return this.name;    }    /**     * @param filter filter to add     * @param direction ISOMsg.INCOMING, ISOMsg.OUTGOING, 0 for both     */    public void addFilter (ISOFilter filter, int direction) {        switch (direction) {            case ISOMsg.INCOMING :                incomingFilters.add (filter);                break;            case ISOMsg.OUTGOING :                outgoingFilters.add (filter);                break;            case 0 :                incomingFilters.add (filter);                outgoingFilters.add (filter);                break;        }    }    /**     * @param filter incoming filter to add     */    public void addIncomingFilter (ISOFilter filter) {        addFilter (filter, ISOMsg.INCOMING);    }    /**     * @param filter outgoing filter to add     */    public void addOutgoingFilter (ISOFilter filter) {        addFilter (filter, ISOMsg.OUTGOING);    }    /**     * @param filter filter to add (both directions, incoming/outgoing)     */    public void addFilter (ISOFilter filter) {        addFilter (filter, 0);    }    /**     * @param filter filter to remove     * @param direction ISOMsg.INCOMING, ISOMsg.OUTGOING, 0 for both     */    public void removeFilter (ISOFilter filter, int direction) {        switch (direction) {            case ISOMsg.INCOMING :                incomingFilters.remove (filter);                break;            case ISOMsg.OUTGOING :                outgoingFilters.remove (filter);                break;            case 0 :                incomingFilters.remove (filter);                outgoingFilters.remove (filter);                break;        }    }    /**     * @param filter filter to remove (both directions)     */    public void removeFilter (ISOFilter filter) {        removeFilter (filter, 0);    }    /**     * @param filter incoming filter to remove     */    public void removeIncomingFilter (ISOFilter filter) {        removeFilter (filter, ISOMsg.INCOMING);    }    /**     * @param filter outgoing filter to remove     */    public void removeOutgoingFilter (ISOFilter filter) {        removeFilter (filter, ISOMsg.OUTGOING);    }    protected ISOMsg applyOutgoingFilters (ISOMsg m, LogEvent evt)         throws VetoException    {        Iterator iter  = outgoingFilters.iterator();        while (iter.hasNext())            m = ((ISOFilter) iter.next()).filter (this, m, evt);        return m;    }    protected ISOMsg applyIncomingFilters (ISOMsg m, LogEvent evt)         throws VetoException     {        return applyIncomingFilters (m, null, null, evt);    }    protected ISOMsg applyIncomingFilters (ISOMsg m, byte[] header, byte[] image, LogEvent evt)         throws VetoException    {        Iterator iter  = incomingFilters.iterator();        while (iter.hasNext()) {            ISOFilter f = (ISOFilter) iter.next ();            if (image != null && (f instanceof RawIncomingFilter))                m = ((RawIncomingFilter)f).filter (this, m, header, image, evt);            else                m = f.filter (this, m, evt);        }        return m;    }   /**    * Implements Configurable<br>    * Properties:<br>    * <ul>    * <li>host - destination host (if ClientChannel)    * <li>port - port number      (if ClientChannel)    * </ul>    * (host not present indicates a ServerChannel)    *    * @param cfg Configuration    * @throws ConfigurationException    */    public void setConfiguration (Configuration cfg)        throws ConfigurationException     {        String h    = cfg.get    ("host");        int port    = cfg.getInt ("port");        if (h != null && h.length() > 0) {            if (port == 0)                throw new ConfigurationException                     ("invalid port for host '"+h+"'");            setHost (h, port);        }        overrideHeader = cfg.getBoolean ("override-header", false);        if (socketFactory != this && socketFactory instanceof Configurable)            ((Configurable)socketFactory).setConfiguration (cfg);        try {            setTimeout (cfg.getInt ("timeout"));        } catch (SocketException e) {            throw new ConfigurationException (e);        }    }    public Collection getIncomingFilters() {        return incomingFilters;    }    public Collection getOutgoingFilters() {        return outgoingFilters;    }    public void setIncomingFilters (Collection filters) {        incomingFilters = new Vector (filters);    }    public void setOutgoingFilters (Collection filters) {        outgoingFilters = new Vector (filters);    }    public void setHeader (byte[] header) {        this.header = header;    }    public void setHeader (String header) {        setHeader (header.getBytes());    }    public byte[] getHeader () {        return header;    }    /**     * @return ISOChannel instance with given name.     * @throws NameRegistrar.NotFoundException;     * @see NameRegistrar     */    public static ISOChannel getChannel (String name)        throws NameRegistrar.NotFoundException    {        return (ISOChannel) NameRegistrar.get ("channel."+name);    }   /**    * Gets the ISOClientSocketFactory (may be null)    * @see     ISOClientSocketFactory    * @since 1.3.3    */    public ISOClientSocketFactory getSocketFactory() {        return socketFactory;    }   /**    * Sets the specified Socket Factory to create sockets    * @param         socketFactory the ISOClientSocketFactory    * @see           ISOClientSocketFactory    * @since 1.3.3    */    public void setSocketFactory(ISOClientSocketFactory socketFactory) {        this.socketFactory = socketFactory;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?