⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basechannel.java

📁 POS is a Java&#174 platform-based, mission-critical, ISO-8583 based financial transaction library/fr
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     */    public Socket getSocket() {        return socket;    }    /**     * @return current serverSocket     */    public ServerSocket getServerSocket() {        return serverSocket;    }    /**      * sets socket timeout (as suggested by      * Leonard Thomas <leonard@rhinosystemsinc.com>)     * @param timeout in milliseconds     * @throws SocketException     */    public void setTimeout (int timeout) throws SocketException {        this.timeout = timeout;        applyTimeout();    }    public int getTimeout () {        return timeout;    }    protected void applyTimeout () throws SocketException {        if (timeout >= 0 && socket != null)             socket.setSoTimeout (timeout);    }    /**     * Connects client ISOChannel to server     * @exception IOException     */    public void connect () throws IOException {        LogEvent evt = new LogEvent (this, "connect");        try {            if (serverSocket != null) {                accept(serverSocket);                evt.addMessage ("local port "+serverSocket.getLocalPort()                    +" remote host "+socket.getInetAddress());            }            else {                connect(newSocket (hosts, ports, evt));            }            applyTimeout();            if (socket != null)                socket.setKeepAlive (keepAlive);            Logger.log (evt);        } catch (ConnectException e) {            Logger.log (new LogEvent (this, "connection-refused",                getHost()+":"+getPort())            );        } catch (IOException e) {            evt.addMessage (e.getMessage ());            Logger.log (evt);            throw e;        }    }    /**     * Accepts connection      * @exception IOException     */    public void accept(ServerSocket s) throws IOException {        // if (serverPort > 0)        //    s = new ServerSocket (serverPort);        // else        //     serverPort = s.getLocalPort();        Socket ss = s.accept();        this.name = ss.getInetAddress().getHostAddress()+":"+ss.getPort();        connect(ss);        // Warning - closing here breaks ISOServer, we need an        // accept that keep ServerSocket open.        // s.close();    }    /**     * @param b - new Usable state (used by ISOMUX internals to     * flag as unusable in order to force a reconnection)     */    public void setUsable(boolean b) {        Logger.log (new LogEvent (this, "usable", new Boolean (b)));        usable = b;    }   /**    * allow subclasses to override default packager    * on outgoing messages    * @param m outgoing ISOMsg    * @return ISOPackager    */    protected ISOPackager getDynamicPackager (ISOMsg m) {        return packager;    }   /**    * allow subclasses to override default packager    * on outgoing messages    * @param image incoming message image    * @return ISOPackager    */    protected ISOPackager getDynamicPackager (byte[] image) {        return packager;    }    /**      * Allow subclasses to override the Default header on     * incoming messages.     */    protected ISOHeader getDynamicHeader (byte[] image) {        return image != null ?             new BaseHeader (image) : null;    }    protected void sendMessageLength(int len) throws IOException { }    protected void sendMessageHeader(ISOMsg m, int len) throws IOException {         if (!isOverrideHeader() && m.getHeader() != null)            serverOut.write(m.getHeader());        else if (header != null)             serverOut.write(header);    }    /**     * @deprecated use sendMessageTrailler(ISOMsg m, byte[] b) instead.     */    protected void sendMessageTrailler(ISOMsg m, int len) throws IOException     {    }    protected void sendMessageTrailler(ISOMsg m, byte[] b) throws IOException     {        sendMessageTrailler (m, b.length);    }    protected void getMessageTrailler() throws IOException { }    protected void getMessage (byte[] b, int offset, int len) throws IOException, ISOException {         serverIn.readFully(b, offset, len);    }    protected int getMessageLength() throws IOException, ISOException {        return -1;    }    protected int getHeaderLength() {         return header != null ? header.length : 0;    }    protected int getHeaderLength(byte[] b) { return 0; }    protected int getHeaderLength(ISOMsg m) {                                           return (!overrideHeader && m.getHeader() != null) ?            m.getHeader().length : getHeaderLength();    }                                                                               protected byte[] streamReceive() throws IOException {        return new byte[0];    }    protected void sendMessage (byte[] b, int offset, int len)         throws IOException    {        serverOut.write(b, offset, len);    }    /**     * sends an ISOMsg over the TCP/IP session     * @param m the Message to be sent     * @exception IOException     * @exception ISOException     * @exception ISOFilter.VetoException;     */    public void send (ISOMsg m)         throws IOException, ISOException, VetoException    {        LogEvent evt = new LogEvent (this, "send");        try {            if (!isConnected())                throw new ISOException ("unconnected ISOChannel");            m.setDirection(ISOMsg.OUTGOING);            m = applyOutgoingFilters (m, evt);            evt.addMessage (m);            m.setDirection(ISOMsg.OUTGOING); // filter may have drop this info            m.setPackager (getDynamicPackager(m));            byte[] b = m.pack();            synchronized (serverOut) {                sendMessageLength(b.length + getHeaderLength(m));                sendMessageHeader(m, b.length);                sendMessage (b, 0, b.length);                sendMessageTrailler(m, b);                serverOut.flush ();            }            cnt[TX]++;            setChanged();            notifyObservers(m);        } catch (VetoException e) {            //if a filter vets the message it was not added to the event            evt.addMessage (m);            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);        }    }    /**     * Sends a high-level keep-alive message (zero length)     * @exception IOException     */    public void sendKeepAlive () throws IOException {        sendMessageLength(0);        serverOut.flush ();    }    protected boolean isRejected(byte[] b) {        // VAP Header support - see VAPChannel        return false;    }    protected boolean shouldIgnore (byte[] b) {        // VAP Header support - see VAPChannel        return false;    }    /**     * support old factory method name for backward compatibility     */    protected ISOMsg createMsg () {        return createISOMsg();    }    protected ISOMsg createISOMsg () {        return packager.createISOMsg ();    }	    /**     * 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 ();  // call createMsg instead of createISOMsg for                                   // backward compatibility        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 <= getMaxPacketLength()) {                    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];                    getMessage (b, 0, len);                    getMessageTrailler();                }                else                    throw new ISOException(                        "receive length " +len + " seems strange - maxPacketLength = " + getMaxPacketLength());            }            m.setPackager (getDynamicPackager(b));            m.setHeader (getDynamicHeader(header));            if (b.length > 0 && !shouldIgnore (header))  // Ignore NULL messages                unpack (m, 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) {            closeSocket();            evt.addMessage ("<peer-disconnect/>");            throw e;        } catch (SocketException e) {            closeSocket();            if (usable)                evt.addMessage ("<peer-disconnect>" + e.getMessage() + "</peer-disconnect>");            throw e;        } catch (InterruptedIOException e) {            closeSocket();            evt.addMessage ("<io-timeout/>");            throw e;        } catch (IOException e) {             closeSocket();            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);        }

⌨️ 快捷键说明

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