📄 basechannel.java
字号:
*/ 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 + -