コード例 #1
0
 public TClientSession(TRepeaterServer pServer, Socket pClientSocket) {
   super();
   // .
   Server = pServer;
   ClientSocket = pClientSocket;
   // .
   synchronized (Server.ClientSessions) {
     Server.ClientSessions.add(this);
   }
   // .
   _Thread = new Thread(this);
   _Thread.start();
 }
コード例 #2
0
    @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);
        }
      }
    }