# Socket-Programmierung in Java



## andy72 (17. Dezember 2006)

Hallo @all,

bin gerade am Programmieren eines MSN-Clients in Java, benutze dazu Sockets und stieß auf folgendes Problem:

Anmeldung beim MSN-Server läuft, ich beziehe auch die Contaktliste und bekomme auf ein Chellenge auch ein OK, nachdem ich den Code zurück gesendet habe. Nun das eigentliche Problem: $MS killt die Verbindung, wenn man nicht (so die Anleitung aus div. Inet-adressen) alle 60 Sekunden einen Ping sendet ("PNG\r\n"). Ich habe das in einer
while-schleife ganz gut realisiert, alles abzufangen, wenn der Server "was will", nur will
ich diese Schleife jetzt in einen Thread packen.

Leider stehe ich dann vor dem Problem, dass die Socket-Variable im Runnable nicht mehr erréichbar ist, und omit gehen BufferedReader und DataOutputStream aus dem Socket verloren. wie kann ich in einer Klasse nun diese Variablen kopieren oder übergeben, so dass die Thread-Klasse darauf zugriff hat ?

Bin für jede Idee dankbar 

LG
Andreas


----------



## andy72 (17. Dezember 2006)

Habe das Problem nun genauer analysiert, und herausbekommen, dass der Socket nicht zur Verfügung steht, wenn im Thread die function "run" aufgerufen wird.

Gibt es eine Möglichkeit, dem Thread den Socket als Kopie oder ähnlich mitzugeben ?
Ich vermute, es ist ein Variablen-Problem, jedoch finde ich keine passende Lösung.
der Socket darf nicht *static* sein, da ich in der Anwendung gleich 3 Sockets benötige


----------



## Thomas Darimont (17. Dezember 2006)

Hallo!

Wenn du die Socket Referenz als final deklarierst kannst du auch von anonymen Inner Classes darauf zugreifen...
Siehe (Einfacher Echo Server):

```
/**
 * 
 */
package de.tutorials;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executors;

/**
 * @author Tom
 * 
 */
public class SocketInThreadExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true) {
            final Socket socket = serverSocket.accept();
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                public void run() {
                    try {
                        Scanner scanner = new Scanner(socket.getInputStream());
                        PrintWriter printWriter = new PrintWriter(socket
                                .getOutputStream());
                        while (true) {
                            String line = scanner.nextLine();
                            System.out.println(line);
                            printWriter.println(line);
                            printWriter.flush();

                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}
```

Gruß Tom


----------



## andy72 (17. Dezember 2006)

Danke für deine Antwort, habe aber das Problem, dass der Socket nicht mehr erreichbar ist:


```
public class MyConnection {
  private Socket sock;
  private BufferedReader in     = null;
  private DataOutputStream out  = null;

  public MyConnection() {
    sock = new Socket("messanger.microsoft.com", 1863);
    in  = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    out = new DataOutputStream(sock.getOutputStream());
  }

  public machwas(String doIt) {
    out.writeBytes(doIt);
  }  

  public void handleRequests() {
    boolean eof = false;
    while(!eof) {
      line = in.readLine();
      System.out.println(line);
      if( line == null)
        eof = true;
    }
  }
}

Aufruf aus anderer Klasse:
MyConnection conn = new MyConnection();
conn.machwas("PNG\r\n");
conn.machwas("CHG 0 BSY 0\r\n");

--->
DER problem-part:
conn.handleRequests();
```

Wichtig, um weitere Anfragen zu beantworten.
sobald ich conn.handleRequests() in einen Thread packe,  der Socket nicht mehr


----------



## JeFi (2. Mai 2007)

Warum leitest du deine Klasse MyConnection nicht einfach von Thread ab und ruftst dann in der run Methode die Funktion auf?


----------



## tobias_petry (2. Mai 2007)

du könntest doch dem thread im konstruktor das objekt deiner tcp/ip verbindung übergeben und dann kennt der thread die verbindung


----------



## andy72 (2. Mai 2007)

Danke für Eure Hilfe, das Projekt habe ich derzeit leider auf Eis gelegt - Ich hatte versucht, einen MSN-Client der das MSN-Protokoll 12 versteht in Java umzusetzen, nach einem Total-Ausfall meines PC sind die Arbeiten nun im Nirvana eines Festplatten-Sektors verschwunden *heul*


----------

