# socket timeout clientseitig



## schlumsch (19. Okt 2010)

Hallo Gemeinde,

also ich bin zugegebenermassen nicht wirklich sattelfest bei den Themen Socket und Thread und hoffe es kann mir jemand helfen.
ich habe eine Klasse in welcher ich durch 3 Methoden erfolgreich eine Socketconnection auf- und abbaue sowie einen bytetransfer herstelle. In einer weiteren methode rufe ich diese Methoden nacheinander auf und übertrage ein xml-file.

Nun möchte ich gerne einen timeout implementieren, allerdings ohne den Server "anzufassen". (Die tatsächliche Implememtierung des Servers kenne ich nicht). So soll zum Beispiel beim connectTCP insgesammt 3mal versucht werden die Verbindung zu erstellen, wobei ein Verbindungsversuch fehlschlagen soll, wenn 5sec. abgelaufen sind. Nach dem endgültigen Scheitern soll nun meine Applikation jedoch nicht beendet werden.

Hier komme ich nun zum Thema Threads. Kann (wie) ich die Methoden zum Auf- abbau und zur Übertragung in einem Thread laufen lassen und dann in der Methode zum Aufrufen nach Ablauf einer bestimmten zeit den thread "abschiessen" ? Gibt es hierzu evtl ein Beispiel / Link? 

Danke schon einmal für die Hilfe,

Gruß




```
// zum uebertragen:
	private static boolean sendXmltoSocket(Document doc) {
		  boolean success = false;
	      Format format = Format.getPrettyFormat();
	      format.setEncoding(xmlFormat);
	      XMLOutputter xmlOut = new XMLOutputter(format);
	      ByteArrayOutputStream myByteArrayOutputStream = new ByteArrayOutputStream();
	      byte[] bytes = null;
          try {
			xmlOut.output(doc,myByteArrayOutputStream);
	          bytes = myByteArrayOutputStream.toByteArray();
	          connectTCP();
	          sendBytes(bytes);
	          disconnectTCP();		
	          success = true;
		} catch (Exception e) {
			success = false;
			e.printStackTrace();
		}
		return success;
	}

public final static void connectTCP() throws IOException {

         logger.info("try to etablish transport layer...");
          logger.info("Transport layer etablished.");

          socket = new Socket(); 
          logger.info("try to connect...");
          SocketAddress addr = new InetSocketAddress(myInetAddress, socketPort);     	  
		socket.connect(addr, socketPort);


      logger.info("Successfully connected.");

    
  }
  
  
  
  
  
  /**
   * disconnects an socket existing connection
 * @throws IOException 
   * @throws SMSCConnectException on error 
   */
  public final static void disconnectTCP() throws IOException {
    if (isConnectedTCP()){


			socket.close();

      
      socket = null;
    }
  }
  
  
  
  /**
   * sends byte over the TCP-Socket
 * @throws IOException 
   * @throws SMSCConnectException on error 
   */
  public final static void sendBytes(byte[] bytes) throws IOException  {

	    logger.info("Try to send bytes over socket..." + socket);
	      OutputStream ostream;
		ostream = socket.getOutputStream();
	      logger.info("...write bytes...");
	      ostream.write(bytes);
	      logger.info("Sent bytes over socket...OK.");



  }
  
  
  /**
   * waits for answer from the TCP-Socket
 * @throws IOException 
   * @throws SMSCConnectException on error 
   */
  public final byte[] receiveBytes() throws IOException  {
      byte[] buffer = new byte[1024];


	      logger.info("Try to read bytes from socket...");
	      InputStream istream;
		istream = socket.getInputStream();

	      istream.read(buffer);
	      logger.info("Read bytes from socket...OK.");


      return buffer;

  }
```


----------



## musiKk (19. Okt 2010)

"Thread abschießen" klingt schonmal schlecht. Hast Du mal Socket#setSoTimeout() probiert?


----------



## schlumsch (20. Okt 2010)

Ja Abschiessen ist auch übertrieben. Ich habe es jetzt so gelöst das ich meine Socketmethoden alle in einem thread nacheinander ablaufen lasse und mir ggf. die exceptions in einem Property merke. Das kann ich dann in regelmässigen Abständen abfragen und daraufhin in meiner Anwendung reagieren.


----------

