# server.accept()



## jobu0101 (3. Mrz 2006)

Ich habe vor 3 Tagen mit der Netzwerkprogrammierung in Java angefangen und habe ein Problem.

Ich will ein Serverprogramm haben, indem ich einstellen kann, ob der Server gerade arbeitet oder nicht. Doch führt er einmal

```
server.accept()
```
aus, wartet er solange auf etwas, bis es kommt? Wie kann ich sagen, dass er maximal 10s warten soll und dann halt gucken soll ob er es nochmal probieren soll oder ob die Servertätigkeit eingestellt werden soll. Eine noch professionellere Lösung als mein Lösungsvorschlag, wäre natürlich auch nicht schlecht!

Danke!


----------



## André B. (3. Mrz 2006)

Ich bin mir nicht sicher, ob das sauber ist, aber vielleicht könntest du einen Thread erstellen, der auf Verbindungen wartet( server.accept() ) und einen, der alle x sec irgendwas macht/überprüft und bei Bedarf den anderen Thread beendet. 
MfG Ikarus


----------



## L-ectron-X (3. Mrz 2006)

Ich weiß nicht, ob ich dich da jetzt richtig verstanden habe.
Mit
	
	
	
	





```
server.setSoTimeout(10000);
```
wird der _accept()_-Aufruf für Clients für 10 Sekunden blockiert.


----------



## jobu0101 (3. Mrz 2006)

Ikarus hat gesagt.:
			
		

> Ich bin mir nicht sicher, ob das sauber ist, aber vielleicht könntest du einen Thread erstellen, der auf Verbindungen wartet( server.accept() ) und einen, der alle x sec irgendwas macht/überprüft und bei Bedarf den anderen Thread beendet.
> MfG Ikarus



Also das läuft schon in einem Thread. Das Problem ist halt, dass ich diesen nicht sauber beenden kann, weil er ja an dem einen Punkt stehen bleibt, bis er ein Signal bekommt.


----------



## jobu0101 (3. Mrz 2006)

L-ectron-X hat gesagt.:
			
		

> Ich weiß nicht, ob ich dich da jetzt richtig verstanden habe.
> Mit
> 
> 
> ...



Also ich weiß nicht richtig, wo ichd as dann einbauen müsste. Mein Programm sieht wie folgt aus:



```
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MulServer {
	static boolean runnig;

	static Thread horch;

	static JButton button1;

	static JLabel label1;

	public static void main(String args[]) throws IOException {

		runnig = false;

		horch = new Thread(new Runnable() {
			public void run() {
				try {
					while (runnig) {

						ServerSocket server = new ServerSocket(3145);

						Socket client = server.accept();

						InputStream in = client.getInputStream();
						OutputStream out = client.getOutputStream();

						int start = in.read();
						int end = in.read();

						int result = start * end;
						out.write(result);

						client.close();
					}
				} catch (IOException e) {
					System.err.println("Problem");
				}

			}
		});

		JFrame f = new JFrame("Datenserver");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container con = f.getContentPane();
		con.setLayout(new GridLayout(0, 1, 5, 5));
		label1 = new JLabel("Noch nicht verbunden", JLabel.CENTER);
		con.add(label1);

		button1 = new JButton("Verbindung herstellen");
		con.add(button1);

		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (runnig) {
					runnig = false;
					label1.setText("Verbindung abgebrochen");
					button1.setText("Verbindung herstellen");

				} else {
					runnig = true;
					horch.start();
					label1.setText("Verbunden");
					button1.setText("Verbindung abbrechen");
				}
			}
		});

		f.setVisible(true);

	}
}
```

Wenn ich die Verbindung abbreche, tritt halt ein Fehler auf, weil der Thread noch ncith beendet wurde!


----------



## André B. (3. Mrz 2006)

Bin mir nicht 100%ig sicher, aber probiers mal vor dem Socket client = server.accept(); in Zeile 36. Wenn ich die Definition von setSoTimeout(10000); richtig verstanden hab, dann müsste der 10 sec auf eine verbindung warten und dann weitermachen. Du müsstest natürlich gucken, dass dein Programm erkennt, ob nun ne Verbindung da ist oder nicht. Also z.B. mit if(client != null) oder so.
MfG Ikarus


----------



## André B. (3. Mrz 2006)

Ok. Ich habe das ganze mal ausprobiert. Wenn das Timeout erreicht ist, dann wirft der eine SocketTimeoutException. Die müsstest du abfangen. Dann könntest du im catch-Block irgendetwas machen und gegebenenfalls die Schleife beenden.


----------



## jobu0101 (3. Mrz 2006)

Werde es gleichmal versuchen. Danke!


Edit: So habe es jetzt.


```
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MulServer {
	static boolean running;

	static Thread horch;

	static JButton button1;

	static JLabel label1;

	public static void main(String args[]) { 

		horch = new Thread(new Runnable() {
			public void run() {
				while (true) {
					if (running) {
						try {
							ServerSocket server = new ServerSocket(3145);
							server.setSoTimeout(5000);
							Socket client = server.accept();
							InputStream in = client.getInputStream();
							OutputStream out = client.getOutputStream();
							int start = in.read();
							int end = in.read();
							int result = start * end;
							out.write(result);
							client.close();
						} catch (IOException e) {
						}
					} else {
						try {
							Thread.sleep(5000);
						} catch (InterruptedException e) {
						}
					}
				}
			}
		});
		
		running = false;
		horch.start();
		JFrame f = new JFrame("Datenserver");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container con = f.getContentPane();
		con.setLayout(new GridLayout(0, 1, 5, 5));
		label1 = new JLabel("Noch nicht verbunden", JLabel.CENTER);
		con.add(label1);

		button1 = new JButton("Verbindung herstellen");
		con.add(button1);

		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (running) {
					running = false;
					label1.setText("Verbindung abgebrochen");
					button1.setText("Verbindung herstellen");

				} else {
					running = true;
					label1.setText("Verbunden");
					button1.setText("Verbindung abbrechen");
				}
			}
		});

		f.setVisible(true);

	}
}
```

Hier habe ich 5 Sekunden Zeit gewählt. Nehme ich eine kleine Zeit, ist kommt es oft vor, dass das Clientenprogramm ne Fehlermeldung liefert, weil ja jede halbe Sekunde für ne kurze Zeit der Server nicth erreichbar ist. Nehme ich eine größere Zeit, kann ich den Server nicht sofort abstellen, sondern nur nach 5 Sekunden aber halt nicht punktuell. Gibt es da denn wirklich keine Lösung?


----------



## André B. (3. Mrz 2006)

Hab nochmal in die API geschaut. Es gibt eine Funktion, die nenn sich close(). Mit der wird das ServerSocket geschlossen.  Kannst ja mal probieren, ob das funktioniert, wenn du das von einem anderen Thread aufrufst.


----------



## jobu0101 (4. Mrz 2006)

Ikarus hat gesagt.:
			
		

> Hab nochmal in die API geschaut. Es gibt eine Funktion, die nenn sich close(). Mit der wird das ServerSocket geschlossen.  Kannst ja mal probieren, ob das funktioniert, wenn du das von einem anderen Thread aufrufst.



Das ist eigentlich keine schelchte Idee. Schließt die dann auch wenn er gerade wartet ohne einen Fehler dabei zu machen?


----------



## André B. (4. Mrz 2006)

Kann ich jetzt hier so nicht sagen. Am besten einfach mal ausprobieren


----------

