Socket Multithread Server

TermOfDay

Mitglied
Hallo ihr hier. :)
Seit kurzer Zeit befasse ich mich mit Java (einstieg ist ja ganz ok wen man schon ne andere P-Sprache kann.) bin aber noch nicht so gut...

Ich hab mir bereits einige Kapitel in verschiedenen Büchern angesehen und hab Google abgegraßt ~,~ aber ergendwie gibs nirgends wirklich was ausschluß gebenes über Multithread Server nur, dass dies möglich ist.
Also mein momentanes vorhaben besteht aus Server und Client (nen normalen Server hab ich schon hinbekomm der zwei Zahlen empfängt und diese Multipliziert.) um genau zu sein geht es um eine art ORPG.
Wobei ich voerst bisschen testen möchte.Gedanken hab ich mir bereits gemacht und eine mini Game eninge gibt es bereits (Figur bewegt sich hoch-runter-recht-links aber auch noch etwas bug-like.).

Gedanken/Plannung:

-User A betritt den Server (App Start), es werden Pakete mit Mapnamen sowie die X.Y-Kordinaten mittels Packet auf den Server übermittelt bei jedem schritt.

-Server erhält die Pakete und überprüft ob ein anderer Client den selben Mapnamen übergibt.
Wenn "True" erhält dieser Client die X.Y-Kordinaten des anderen Clienten.

-bsp: User B betritt Server, landet auf der selben Map, Daten werden übertragen und empfangen = Server stellt fest User A = Map1 User B = Map2 also bekommt User B die Daten(X.Y) von User A und User A die von User B (usw. User = C ,D ,E ,F...) und immer von neuen.Sie müssen sich ja bewegen sehen.

Das mit dem Mapnamen überprüfen ist daführ gedacht das der Server nicht immer wieder an alle Clienten die Daten von Usern senden muss die sowieso nicht auf dergleichen Map herum renn, sollte Bytes sparen oder?Oder seh ich das falsch und es ist egal?

Gibt es sonst was worauf zu achten wäre?

Nun mittels Multithread sicher möglich?Währe nett wen Jemand mir etwas unter die Arme greifen könnte.Und sorry das ich noch keinen eigenden richtigen Quellcode ansatz momentan habe, trotzdem bitte ich um Tipps und kein vollwertigen Server sonst lerne ich ja nichts. =P

Vielen dank schoneinmal ;)

MfG

TermOfDay
 

XHelp

Top Contributor
Ich vermute mal, dass es ein Tippfehler ist, aber: warum wird zwischen den beiden User koordinaten ausgetauscht, wenn die auf verschiedenen Maps sind?
Für solche Sachen ist es besser ein eigenes Protokoll zu entwickeln. Ich denke nicht, dass es Sinnvoll ist (auch wenn einfacher) serialisierte Objekte hin und her zu schicken.
Da gibt es auch sonst jede Menge worauf du achten musst. Stell dir z.B. vor der Client fängt an zu cheaten und spring gleich 30 Schritte vor... aber das ist nur der kleinste Gedanke.

Wenn du es schon mit verschiedenen Maps machen willst, dann ist es auch besser die User nach Maps gespeichert zu halten. Dann brauchst du nichts vergleichen, sondern weißt: "alle User, die ich hier habe, spielen auf der selben Map".
Ich will dir natürlich nichts unterstellen, aber du wirst (wegen fehlender Erfahrung) jede Menge Fehler machen. Das ist aber ganz natürlich und nur so wirst du es lernen. Dennoch solltest du vllt. vorher dir den theoretischen Kram zu gemüte führen. Ich habe noch nie ein Spiel geschrieben, aber da gibt es vermutlich auch schon ausgereifte "Entwurfsmuster", Tutorials, Auflistung von Unterwassersteinen usw.

Zu deiner eigentlichen Frage: ich weiß gar nicht, was du damit gemeint hast. Ein Server, der simultan mehrere Clients abarbeitet ist schon von der Definition her "multithread"-fähig. Und falls du Tips für das Spiel brauchst, hast du dich vermutlich im Forum geirrt.
 

TermOfDay

Mitglied
Den theoretischen kram arbeite ich bereits ab x) aber wie in PHP lern ich am besten wen ich gleich mittel/größere dinge anpack.

Zu den Maps:

-Es gibt verschiedene z.b: firedungeon_1.karte usw.

-Die 30 schritte mehr (Cheaten) währen doch egal?Im sinne der Server berechnung jetzt, weil der Server doch sofort die neue Position (x.y) an die anderen Clients schickt damit diese wissen/interpredtieren wo User X steht.

-Mit dem Map vergleich ist gemeint, dass User A der sich jetzt z.b in einer Stadt befindet braucht ja nicht die Daten von User B und User C weil diese z.b in einem Dungeon sind.
Aber diese (User B u. C) untereinander brauchen wieder die Pakete weil sie ja auf dem gleichen Gebiet sind.
Doch User D ist auch noch da und in der gleichen Stadt(Map) wie User A, also bekommen User A und D auch nur ihre Pakete einander zugeschickt.

Die User mittels Maps zu speichern währe wieder zu speicherlastig würde ich mal vermuten, also mittels MySQL.
Bei einem Verbindungsabbruch/Verlassen des Spieles würde es zweck und sinn ergeben die letzten dem Server bekannten Kordinationen an eine Datenbank zu senden (Account Datenbank => Mapname: xxx kord-x: xx kord-y: yy) sobald der Server erkennt "ah User A ist getrennt, dann wollen wir mal eben ein Datenbank Update vollführen".

Momentan gibt es erst eine Karte (15x15) aber ich meine es ergebe doch sinn nur die User anzusprechen/zu versorgen die auch in reichweite sind.

Die eigentliche frage: Wie mach ich das mit Multithread?
Nachdem was ich gelesen habe ist Socket Server (normaler Server) != Multithread Server der mehr zur gleichen Zeit verarbeitet.

Hoffe ist verständlicher.
Im großen und ganzen => Brauche mal hilfe im Syntax setzen eines Servers der mit Multithread arbeitet.
Durch fehler lernt man immer am besten ^^ wen alles sofort klappen würde, würds ja keinen spaß machen.
=)

MfG

TermOfDay
 

XHelp

Top Contributor
Du hast gerade ziemlich viel zusammengewürfelt im 1. Teil der Antwort.
Bleiben wir vorerst beim Thema:
Java:
initServerSocket();
while (true) {
  Socket socket = serverSocket.accept();
(new ResponseThread(socket).start();
}
so in etwa müsste es ablaufen. D.h. ein Thread ist dazu da Verbindungen anzunehmen. Aber die Bearbeitung läuft in separaten Threads. Dadurch wird der "main"-Thread nicht blockiert.
 

TermOfDay

Mitglied
Versteh ich das nun richtig?Hab in deinem Quellcode kommentare geschrieben.

Java:
initServerSocket(); //port?
while (true) { //Schleife, klar.
  Socket socket = serverSocket.accept(); //aktzeptiert verbindung
(new ResponseThread(socket).start(); /*startet nun immer einen thread für neue User?Und es können mehr joinen?*/
}
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Ja. Pro Verbindung wird ein Thread erstellt. Deswegen können auch gleichzig mehrere Verbindungen gleichzeitig abgearbeitet werden.
 

TermOfDay

Mitglied
Okay dan bedank ich mich fürs erste =) und hab dir mal den Danke-Button gedrückt.
Werds nun mal probieren.

Edit:

Java:
package serverclientdiezweite;

/*
 * @author Hendrik
 */

import java.io.*;
import java.net.*;

class testServer
{
	public static void main(String args[])
	{
		System.out.println("Server läuft...");
		new server().start();
	}
}

class server extends Thread
{
	ServerSocket ssock;
	Socket csock; 

	public server()
	{
		try
		{
			ssock = new ServerSocket(50000);
		}
		catch (IOException e)
		{
			System.out.println("Port wird nicht aktzeptiert");
			System.exit(1);
		}
	}

	public void run()
	{
		while (true)
		{
			if(ssock == null)
			{
				System.out.println("Kein gegen Port");
				System.exit(1);
			}
			try
			{
				csock = ssock.accept();
				System.out.println("Jemand betritt den Server");
                                new run(ssock).start();

			}
			catch (IOException e)
			{
				System.out.println("Keine Spieler beigetretten");
				System.exit(1);
			}
		}
	}

}

So habe ich den Server jetzt geschrieben, der rest kommt noch aus meinem vorherigen versuch.
Passt das so?Jetzt nur noch denClienten und die Pakete die versendet werden müssen und vom Server weiter gesendet werden.
Jemand anhaltspunkte? =)
 
Zuletzt bearbeitet:

TermOfDay

Mitglied
Habn problem mitn Multithread dings...

Mein jetziger Server =>
Sobald ich
Java:
Socket = new server.accept();
hinzufüge kackt der Server + Client beim verbinden ab.

Java:
package server;

import java.io.*;
import java.net.*;


/**
 *
 * @author Hendrik
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        System.out.println("Starte Server...");
        ServerSocket server = new ServerSocket(50000);
         
        while(true)
{
    Socket client = null;
    client = server.accept();
    ConnectionHandle(client);
    Socket = new server.accept();

        }


}

public static void ConnectionHandle(Socket client) throws IOException
{


    System.out.println("Neuer Client verbindet sich...");

    Scanner in = new Scanner(client.getInputStream());
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);

    String factor1 = in.nextLine();

    out.println("Sie haben sich mit dem Server verbunden..." + factor1);

}


    }

Wie mach ich das jetzt mitn Multithread hier?

Edit:Obwohl sich zwei Clients verbinden können. Oo
 
Zuletzt bearbeitet:

Sekundentakt

Bekanntes Mitglied
Hi TermOfDay,

hinzufüge kackt der Server + Client beim verbinden ab.
Das ist keine Fehlerbeschreibung. Was wird Dir konkret angezeigt?

Die User mittels Maps zu speichern währe wieder zu speicherlastig würde ich mal vermuten, also mittels MySQL.
Genau das wäre der falsche Weg.
Davon ausgehend, dass Du die Daten in Echtzeit brauchst, ist MySQL kein guter Ansatz. Die Daten werden hier auf Platte geschrieben und selbst wenn sie irgendwo gecached würden, verblieben sie im Speicher. Das Argument "zu speicherlastig" zählt hier also nicht :). Durch die Festplattenaktivität würde sich die Performance des Servers selbst noch einmal reduzieren.
Falls Du an die Memory-Tables gedacht hast: Auch die verbrauchen Speicher und sind an sich nichts anderes als eine Art HashMap. Ich habe selbst mal einige Tests mit Memory-Tables gemacht und war enttäuscht. Ich habe mal 3mio Datensätze aus Tabelle x ausgelesen und in eine Memory-Table geschrieben. Das Ganze dauerte über eine Minute.
Selbiger Vorgang bei einer MyISAM-Tabelle gute 30 Sekunden, wenn's denn mal lange gedauert hat.
Warum das so ist, weiß ich nicht. Ich kann es nicht empfehlen.

Die Kommunikation sollte also nach Möglichkeit direkt zwischen den Spielern erfolgen. Und zur Speicherlast: Gesetz dem Fall X und Y sind Floats und eine HashMap speichert den Hash als Long bzw. Integer (müsste man nachsehen), dann ließe sich doch recht schnell überschlagen, wie viele Spieler Dein Server maximal bei welchem für die Koordination zur Verfügung stehenden Speicher handeln kann.

Momentan gibt es erst eine Karte (15x15) aber ich meine es ergebe doch sinn nur die User anzusprechen/zu versorgen die auch in reichweite sind.
Es würde verwirren, wenn man Leute nicht sehen könnte, die eigentlich da sind, wo ich sie sehen müsste. Wenn Deine Map also erhöhte Punkte mit guter Sicht über die Karte aufweißt, wäre eine Sichteinschränkung problematisch.

Viel Erfolg :).
 

XHelp

Top Contributor
Habn problem mitn Multithread dings...
Nun, das größte Problem welches du mit dem Muthithread dings im Moment hast ist die Tatsache, dass du kein Muthithread dings hast...
liest dir Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11 Threads und nebenläufige Programmierung durch (ich meine wirklich lesen, nicht kurz überfliegen), dann solltest du eine ungefähre Vorstellung von Threads haben.
[JAVA=21]
while(true)
{
Socket client = null;
client = server.accept();
ConnectionHandle(client);
Socket = new server.accept();

}
[/code]
Was hast du dir dadrunter vorgestellt wie es funktionieren soll? Um genaug zu sein: was soll die Zeile 26 deiner Meinung nach tun?
Wie mach ich das jetzt mitn Multithread hier?
Naja, dazu brauchst du Threads. Eine statische Methode aufzurufen bringt da nichts. Außerdem ist den Server in der main-Klasse zu haben äußerst unschön. Mach dir eine eigene Klasse
Code:
ServerConnector
, die dann für den ServerSocket zuständig ist.
 

TermOfDay

Mitglied
@XHelp:

Ja das Buch lese ich ja, bloß öffters gibs dort mit dem Quellcode probleme aber gut selber etwas denken. =)

Ja das mit dem Server habe ich mir dort auch angelesen (sollte etwas ähnlichkeit aufweißen) wollte das mit dem Main noch ändern.
Zeile 26 soll eine neue Socket verbindung schalten/freigeben, also neuen Client zulassen.

Müsste ich z.B bei einer zweiten File Server.java es so machn?

Java:
public class Server extends Thread{

...

}

@Sekundentakt:

Ja, gut die MySQL Datenbank soll nur für den Rejoin genutzt werden und beim Verlassen, dass der Server speichert wo der letzte bekannte ort des Spielers war [Map] [Kord-X] [Kord-Y].
Gedacht wurde auch das man ja Events/NPC's über die Datenbank die Map sowie Kord's gibt wo diese/r stehen solle.
Wäre doch egal wen der Client die Maps besitzt?Mehr als aussehen könnte man nicht ändern und sonst die Maps mittels prüfsumme das nix geändert wurden ist?Ich meine an Events/NPC's würde der Nutzer garnicht ran komm.

Die Maps sollen auf Tileset basis ^^ soll kein 3D oder sowas werden.Und diese Maps werden verknüpft mittels eines lade übergangs, also deswegen auch nur Packete an die, die auch auf der Map sind.

Scheinst dich auszukenn über Game prograammierung?

Danke euch beiden ;)

MfG

TermOfDay
 

XHelp

Top Contributor
Ja das mit dem Server habe ich mir dort auch angelesen (sollte etwas ähnlichkeit aufweißen) wollte das mit dem Main noch ändern.
Zeile 26 soll eine neue Socket verbindung schalten/freigeben, also neuen Client zulassen.

Müsste ich z.B bei einer zweiten File Server.java es so machn?
Die Zeile 26 kannst du weglassen, denn in der 1. Zeile der Schleife machst du es ja schon.
Ja, du brauchst 2 Thread. Thread-Server, damit dein restliche Programm nicht blockiert und Thread-Responder, damit beim Antworten dein Server nicht blockiert.
 

TermOfDay

Mitglied
Meinst du ungefähr soetwas?Ist aus Java Insel 8.


Java:
import java.io.IOException; 
import java.net.*; 
 
public class CloseConnection 
{ 
  public static void main( String[] args ) throws Exception 
  { 
    new ServerSocket( 12345 );     // Server anmelden 
 
    final Socket t = new Socket( "localhost", 12345 ); 
 
    new Thread( new Runnable() 
    { 
      public void run() 
      { 
        try 
        { 
          System.out.println( "Gleich hängt er!" ); 
          System.out.println( t.getInputStream().read() ); 
          System.out.println( "Hier hängt er!" ); 
        } 
        catch ( IOException e ) 
        { 
          System.out.println( "Blockierung gelöst" ); 
        } 
      } 
    } ).start(); 
 
    Thread.sleep( 2000 ); 
 
    t.close();  // Releases the block 
  } 
}

Wäre das schonmal ein lösungs einsatz für mich?

Edit:Hab eben mal etwas weiter gelesen und bin bei dem Thema "Datagram-Sockets", wäre dies später einbaubar?Oder überhaupt empfehlendswert?Obwohl ja verbindungslosen Pakettransport.

Stream oder Datagram Oo naya gut vielleicht sollte ich ersteinmal bei Stream-Sockets bleiben.Obwohl die Methode der Verbindung ja schneller senden kann.

Edit 2:Also nachdem ich jetzt alles aufgelistete aus dem ebook über UDP gelesen habe, scheint mir das die bessere lösung als ORPG Server?Wie ist eure erfahrung zu UDP vs TCP.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Was das Beispiel angeht: Da ist ein Socket und ein Thread, so gesehen ist es das was du bruachst, aber der Ablauf ist natürlich verkehrt.
Also nachdem ich jetzt alles aufgelistete aus dem ebook über UDP gelesen habe, scheint mir das die bessere lösung als ORPG Server?
UDP oder TCP nimmst du ja nicht "als Server". Das ist nur ein Protokoll. Auf UDP würde ich an deiner Stelle verzeichten. Er ist statuslos, so dass du nicht weißt ob ein Paket wirklich angekommen ist oder nicht. Bei TCP kann der Rechnet feststellen, dass ein Paket/Teil davon korrupt ist und es nochmal anfordern. Desweiteren ist bei UDP nicht sicher, dass wenn du Pakete A, B, C schickst, dass es auch genau in der Reihenfolge ankommt. Da es auch keine dauerhafte Verbindung besteht wirst du ggf Schwierigkeiten mit der Authorisierung haben. usw usw usw...
Außerdem: wenn du dein Programm überdacht strukturierst, dann kannst du die Transportebene sogar austauschen.
 

Sekundentakt

Bekanntes Mitglied
Wäre doch egal wen der Client die Maps besitzt?
Je nachdem. Ich weiß nicht, ob es von Nachteil bei diesem Spiel wäre, wenn Du auch die Position Deiner Gegner auslesen kann und ob er hierdurch einen unfairen Vorteil durch Knacken des Protokolles erhalten könnte.
Ich bin mir aber auch nicht so ganz sicher, wodrauf Du dich mit dieser Frage beziehst. Dazu habe ich doch gar nichts gesagt? :)
Die Koordinaten müssten natürlich zwischen den Spielern ausgetauscht werden - insofern ist es sogar notwendig, Maps auszutauschen. Ich weiß aber wirklich nicht, worauf Du dich konkret beziehst.

Gedacht wurde auch das man ja Events/NPC's über die Datenbank die Map sowie Kord's gibt wo diese/r stehen solle.
Ich versuche mal laut zu denken :). Eine Map ist ein Objekt. Ein Objekt hat Eigenschaften. Ein Objekt kann man serialisieren und in einer Datenbank abspeichern. Sobald man es benötigt, etwa wenn man eine Runde auf dieser Map spielen möchte, kann man das Objekt laden und deserialisieren. Von komplexen Spielen kennt man ja die etwas längeren Ladezeiten, vermutlich rühren die daher.
Wenn mans ganz genau nimmt, braucht man nicht mal eine Datenbank für die Map, sondern nur eine Datei. Die könnte sogar im XML-Format vorliegen und enthält sämtliche Informationen zu Ereignissen und NPC-Positionen.
Das Ganze wird einmal zu Beginn des Spieles auf der Map eingelesen und verbleibt dann im Speicher, wo man schnellen Zugriff darauf hat.

Scheinst dich auszukenn über Game prograammierung?
Nein, eigentlich überhaupt nicht. :) Womit ich mich "auskenne" oder eher sehr intensiv befasse, sind High-Performance Ansätze und - Techniken in Theorie und Praxis. Einige davon probiert man dann auch selbst mal aus und gewinnt dadurch Erfahrungen. Mit GUI & Co kenne ich mich eigentlich gar nicht aus. :)

Edit:Hab eben mal etwas weiter gelesen und bin bei dem Thema "Datagram-Sockets", wäre dies später einbaubar?Oder überhaupt empfehlendswert?Obwohl ja verbindungslosen Pakettransport.

Stream oder Datagram Oo naya gut vielleicht sollte ich ersteinmal bei Stream-Sockets bleiben.Obwohl die Methode der Verbindung ja schneller senden kann.

Edit 2:Also nachdem ich jetzt alles aufgelistete aus dem ebook über UDP gelesen habe, scheint mir das die bessere lösung als ORPG Server?Wie ist eure erfahrung zu UDP vs TCP.
Ich persönlich komme auch aus der PHP-Ecke und glaube auch, dass man durch komplexere Projekte die meiste Erfahrung in einer neuen Sprache machen kann.
Aber... ich glaube Du bist hier etwas zu schnell!
Mein Vorschlag wäre: Erstelle erst mal einen Server, der läuft und der das macht, was Du Dir zum Ziel gesetzt hast: Mehrere Clients parallel handeln können.
Wenn der funktioniert und Dein Game drauf läuft, kannst Du immer noch Performance-Verbesserungen daran vornehmen oder noch mal neu anfangen.

Mein erstes komplexeres Programm, bei dem ich Nebenläufigkeit ausprobiert habe, habe ich über 24 Stunden lang debuggt und dann immer noch nach Fehlern gesucht.
Es kostete mich gerade einmal 4 Stunden das Ganze mit dem bisherigen Wissen von Grund auf neu zu schreiben. Im Ergebnis war es fehlerfrei und lief schneller und speichersparender.

Außerdem: wenn du dein Programm überdacht strukturierst, dann kannst du die Transportebene sogar austauschen.
Ich bin in der JavaEE noch nicht ganz fit, aber stellt die Server-Klasse nicht sogar die Presentationtier dar?
Eigentlich müsste es da doch möglich sein, die Eigentliche Anwendung in sich funktionierend außerhalb der Server-Klasse zu definieren und diese dann nur via Server ansprechen zu lassen. Damit einher ginge auch die Möglichkeit Protokolle und sonstige Details zur Kommunikation unabhängig von der eigentlichen Applikation zu modifizieren.
Das sind nur ein paar laute Gedanken zu dem Thema. Eventuell kann das ja einer bestätigen.

Beste Grüße
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Eigentlich müsste es da doch möglich sein, die Eigentliche Anwendung in sich funktionierend außerhalb der Server-Klasse zu definieren und diese dann nur via Server ansprechen zu lassen. Damit einher ginge auch die Möglichkeit Protokolle und sonstige Details zur Kommunikation unabhängig von der eigentlichen Applikation zu modifizieren.
Das meine ich ja... Das Spiel kann ja dem Connector sagen: "schick mal XY und gib mir die Antwort". Wie der Connector es macht ist ja dann seine Sache.
 

TermOfDay

Mitglied
XHelp hat gesagt.:
Was das Beispiel angeht: Da ist ein Socket und ein Thread, so gesehen ist es das was du bruachst, aber der Ablauf ist natürlich verkehrt.

Ja ich muss ja
Java:
new ServerSocket()
in den Thread mittels Schleife setzen damit dieser, diesen neu ausführt bei einer neuen verbindung (hab das jetzt doch richtig verstanden?Mensch komplexere Programmiersprachen sind interessant.).

Anschließend lasse ich mir mittels
Java:
getInputStream
alles zeigen => Map-Name(erst einmal nebensächlich) + Kords.
Diese erhaltenden Daten müssen dann natürlich an alle weiteren Aktiven(interessierten) Clienten weiter geschickt werden, ebenfalls mittels
Java:
while
nehme ich an.

Nun die frage: Sollte man die Schleife zwischenzeitig stoppen?So etwa 2-4 Sek. obwohl dies sicher zu "Lag" ähnlichen anblick führen würde.

Sekundentakt hat gesagt.:
Mein Vorschlag wäre: Erstelle erst mal einen Server, der läuft und der das macht, was Du Dir zum Ziel gesetzt hast: Mehrere Clients parallel handeln können.

Du hast recht, ja werde ich so auch ersteinmal machen.
Auch wen du dich mit dem Thema auseinandersetzt hast du gute gedanken dazu.
Und die position der Gegner wäre kein wirklicher vorteil.

Danke euch beiden.
 

XHelp

Top Contributor
Wie schon weiter oben gesagt: schmeiß nicht alles in ein Topf. Wen du welche Maps und Koordinaten zeigst ist erstmal völlig nebensächlich. Deine Hauptaufgabe ist im Moment einen TCP Server zu basteln, der mehrere Client auf einmal bedienen kann.
Einen ServerSocket musst du nur einmalig erstellen, sonst ist da gar keine Multiclientfähigkeit vorhanden. (zumal du nicht einen neuen ServerSocken auf den gleichen Port ansetzen kannst).
Damit du ungefähre Vorstellung davon hast, schreibe ich dir hier ein wenig Code:
Java:
public class Server extends Thread {

	/**
	 * Der einzige ServerSocket, den du brauchst
	 */
	private ServerSocket servSocket;

	/**
	 * Port, auf dem der ServerSocket lauschen soll
	 */
	private int port;

	/**
	 * Constructor
	 * 
	 * @param port
	 *            Port auf dem der Server lauschen soll
	 */
	public Server(int port) {
		this.port = port;
	}

	/**
	 * ServerSocket initialisieren.
	 */
	private void initServerSocket() {
		try {
			servSocket = new ServerSocket(port);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		System.out.println("Server starten..."); // debug
		initServerSocket(); // initialisiere
		System.out.println("Server gestartet..."); // debug
		while (true) { // läuft ewig
			try {
				Socket clSocket = servSocket.accept(); // Clientverbindung
														// annehmen
				System.out.println(this.getName() + ": neuer Client verbunden"); // debug
				(new ResponseThread(clSocket)).start(); // neuen Thread starten,
														// der den Client
														// bedient.
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Natürlich ist es eher Gedankenanstoß als fertiger Server. Da musst du noch
Code:
ResponseThread
selber schreiben. Dafür musst du einen Constructor bauen, dem ein Socket übergeben wird und
Code:
run()
überschreiben, wo du letztendlich die Eingaben des Benutzers auswertest.
 

Sekundentakt

Bekanntes Mitglied
Ich würde Dir zusätzlich empfehlen, mal einen Blick auf Executor Services zu werfen. Das ist ein High-Level-Thread-Management-Tool.
Dadurch kannst Du zum Beispiel verhindern, dass Dein Server überflutet wird, weil zuviele Clients eine Verbindung zu ihm aufgebaut haben.
 
G

Gast2

Gast
Aus Erfahrung: Ich würde das nicht selber machen.

Wenn dann mit einem (doch recht aufwändigen) Reactor Pattern -> siehe http://ronsoft.net/files/NIOServerMark3.pdf

Alternativ einfach gleich mit netty arbeiten. Da wird dir schon eine Menge an low level Arbeit abgenommen und gute Interfaces angeboten. Die Hanlder sollten dann wirklich über einen Executor Service laufen. Thread Managemnet selber machen ist immer etwas unglücklich und hakelig.
 

TermOfDay

Mitglied
So der Server ist soweit erstmal lauffähig!
Danke an euch für eure "tapfere" hilfe. =P
Nun beschäftige ich mich erstmal mit dem Client und komm auch gut voran und lern fleißig.
Würde sagen das somit das Thema hier vorerst erledigt ist!

Danke nochmal. =)

MfG
TermOfDay
 

dayaftereh

Top Contributor
Hey.Ich habe mal vor kurzer zeit ein Kleines Projekt zu MultiTherad Server gemacht, der folgende Source Code ist so weit Kommentiert. vielicht hilf er die ein wenig. Es ist eine Chat mit Server, wo folgenes abläuft, eine Client baut eine Verbindung zum Server auf und der Server Mach einen Dispatcher Thread auf. alle Ankommenden Chat Packete, es ist ein eigenes Protokoll, werden vom Dispatcher Therad in eine Theradpool geworfen und abgearbeitet ( auf der Server Seite).Der nachteil ist hier, das keine NIO genutzt worden ist, für jeden Client wird ein Therad auf dem Server geöffnet!!! Melde dich Wenn fragen sind
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Socket 2x Proxy multithread-server mit Cross Verbindung Netzwerkprogrammierung 0
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
F Verbindung zwischen Server und handy Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
R RMI Server RMI Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben