@Override public void run() { try { try { synchronized (TLANConnectionRepeater.this) { ConnectionsCount++; } try { ClientSocket.setSoTimeout(ServerReadWriteTimeout); ClientSocket.setTcpNoDelay(true); // . InputStream IS = ClientSocket.getInputStream(); try { OutputStream OS = ClientSocket.getOutputStream(); try { TLANConnectionClient LANConnectionClient = new TLANConnectionClient(TLANConnectionRepeater.this, OS); try { byte[] TransferBuffer = new byte[TLANConnectionRepeater.TransferBufferSize]; int ActualSize; switch (TLANConnectionRepeater.this.ConnectionType) { case LANConnectionRepeaterDefines.CONNECTIONTYPE_NORMAL: while ((!Canceller.flCancel) && LANConnectionClient.flRunning) { try { ActualSize = IS.read(TransferBuffer, 0, TransferBuffer.length); if (ActualSize == 0) break; // . > connection is closed else if (ActualSize < 0) { if (ActualSize == -1) break; // . > stream EOF, connection is closed else throw new IOException( "error of reading Repeater socket data, RC: " + Integer.toString(ActualSize)); // . => } } catch (SocketTimeoutException E) { continue; // . ^ } // . if (ActualSize > 0) { if (OnDestinationBytesTransmiteHandler != null) OnDestinationBytesTransmiteHandler.DoOnBytesTransmite( TransferBuffer, ActualSize); // . LANConnectionClient.ServerSocketOutputStream.write( TransferBuffer, 0, ActualSize); // . LANConnectionClient.ServerSocketOutputStream.flush(); } } break; // . > case LANConnectionRepeaterDefines.CONNECTIONTYPE_PACKETTED: byte[] PacketSizeBA = new byte[4]; int PacketSize; while ((!Canceller.flCancel) && LANConnectionClient.flRunning) { try { ActualSize = IS.read(PacketSizeBA, 0, PacketSizeBA.length); if (ActualSize == 0) break; // . > connection is closed else if (ActualSize < 0) { if (ActualSize == -1) break; // . > stream EOF, connection is closed else throw new IOException( "error of reading server socket data descriptor, RC: " + Integer.toString(ActualSize)); // . => } } catch (SocketTimeoutException E) { continue; // . ^ } if (ActualSize != PacketSizeBA.length) throw new IOException("wrong data descriptor"); // . => PacketSize = (PacketSizeBA[3] << 24) + ((PacketSizeBA[2] & 0xFF) << 16) + ((PacketSizeBA[1] & 0xFF) << 8) + (PacketSizeBA[0] & 0xFF); if (PacketSize > 0) { if (PacketSize > TransferBuffer.length) TransferBuffer = new byte[PacketSize]; ActualSize = InputStream_Read(IS, TransferBuffer, PacketSize); if (ActualSize == 0) break; // . > connection is closed else if (ActualSize < 0) { if (ActualSize == -1) break; // . > stream EOF, connection is closed else throw new IOException( "unexpected error of reading server socket data, RC: " + Integer.toString(ActualSize)); // . => } } // . if (OnDestinationBytesTransmiteHandler != null) OnDestinationBytesTransmiteHandler.DoOnBytesTransmite( TransferBuffer, PacketSize); // . LANConnectionClient.ServerSocketOutputStream.write( PacketSizeBA, 0, PacketSizeBA.length); if (PacketSize > 0) LANConnectionClient.ServerSocketOutputStream.write( TransferBuffer, 0, PacketSize); // . LANConnectionClient.ServerSocketOutputStream.flush(); } break; // . > } } finally { LANConnectionClient.Destroy(); } } finally { OS.close(); } } finally { IS.close(); } } finally { synchronized (TLANConnectionRepeater.this) { ConnectionsCount--; } } } finally { synchronized (Server.ClientSessions) { Server.ClientSessions.remove(this); } // . ClientSocket.close(); } } catch (Throwable T) { if (!Canceller.flCancel) { if (ExceptionHandler != null) ExceptionHandler.DoOnException(T); } } }