Socket Threadunterbrechung verhindern

A13X

Mitglied
Hallo Leute.
Ich schreibe gerade an einem Socketbasierten Plugin.
Dieses Plugin ist für einen Multiplayerserver gedacht.
Das die SocketAPI dauerhaft den Thread anhält ist also hinderlich.
Ich schaffe es allerdings nicht, das zu ändern.

Ich habe es so gemacht:

Beim aktivieren des Plugins wird
Code:
new SocketListener()
aufgerufen.

Konstruktor:
[JAVA=18]
try {
server=new ServerSocket(Server.getConfig().getInt("net.port"));
listen();
} catch (Exception e) {
e.printStackTrace();
}
[/code]

In der Methode listen() habe
ich für accept() einen neuen thread erstellt:
[JAVA=27]
Thread t=new Thread(new Runnable(){
@Override
public void run() {
while (!server.isClosed()){
Socket skt;
try {
skt = server.accept();
new Processor(skt);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
t.run();
[/code]

Der Prozessor ist eine Klasse, die Die Anfrage verarbeitet und antwortet. Da wird der listener Thread zwar kurzzeitig angehalten, allerdings hat das geklappt.
Der Hauptthread wird aber trotzdem DAUERHAFT angehalten.

Muss ich hier nur etwas korrigieren, oder ist mein Ansatz einfach falsch?

Ich hoffe dass ihr diesen langen Text lesen konntet und natürlich auf eure Hilfe :D
 
Zuletzt bearbeitet:

rme

Top Contributor
Ich finde den Ansatz unschön. Man sollte nicht für jeden Client einen neuen Thread erzeugen, denn dann skaliert das Programm nicht, wenn mehrere Clients hinzukommen. Man kann das alles in einem Thread machen, indem man die New-IO-Klassen verwendet, da blockiert nämlich gar kein Aufruf.

Hier ist eine Einführung: Java NIO server example
 
Zuletzt bearbeitet:

A13X

Mitglied
Vielen dank, aber dass wird wahrscheinlich nicht funktionieren.
Der Server läuft nämlich noch auf Java 6.
Soweit ich es verstanden habe ist NIO erst bei Java 7 eingeführt worden.

Ich fände diesen Ansatz auch unschön. Aber ich öffne ja nicht für jeden Client einen neuen Thread.
Nur eine neue Klasse.
Es gibt den Hauptthread auf dem das Spiel läuft und den Nebenthread, der auf Clients wartet und dessen Anfragen verarbeitet. Zumindest sollte es so sein...
Code:
 

rme

Top Contributor
Achso. Dann ist dein Problem ja nur, dass du t.run() aufrufst - damit wird die Runnable sofort ausgeführt, d.h. es wird gar kein Thread gestartet. Dafür müsstest du t.start() aufrufen, das erzeugt einen neuen Thread und ruft *darin* die run-Methode auf :) Also einfach t.run() durch t.start() ersetzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Socket Closed Exception verhindern Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben