UDP-Server mit Threads

Status
Nicht offen für weitere Antworten.

lordnikon

Mitglied
Hallo,

ich habe folgendes Problem. Ich muss als Studienarbeit ein Chatprogramm (TCP) in UDP umwandeln.

Ein UDP Server soll Nachrichten von mehreren Clients empfangen. In der TCP Implementierung wird für jeden Client der sich neu Verbindet ein Thread gestartet der die weitere Behandlung eingehender Nachrichten übernimmt.

Wie kann man dies nun bei UDP implementieren?
Ist es möglich für jeden sich neu verbindenden Client einen Thread zu starten und bestehende Verbindungen zu erkennen?

Da UDP nicht Verbindungsorientiert ist dürfte dies doch nicht möglich sein.
Wie kann man dies also behandeln?
 
T

tuxedo

Gast
Naja, du musst dir da ein Protokoll um UDP drum rum basteln. Bei TCP hat es ja gereicht nur die eigentliche Nachricht zum Server zu übermitteln. Den Sender hat der Server ja anhand der Verbindung erkannt. Bei UDP musst du jetzt die Pakete mit Absender etc. etwas aufblasen.

Der Client muss ein Login-Paket senden das den Benutzernamen etc. enthält. Der Server nimmt das entgegen, erkennt das Loginpaket und generiert eine ID. Diese ID teilt er dem Client mit und merkt sich selbst (in einer Liste) "Der Client mit dem Namen ABC hat eben von mir die ID 123 bekommen".

Am Server bastelst du dir am besten eine Art Paket-Dispatcher der Pakete entgegen nimmt, rein schaut von wem sie sind und was es ist (nachricht, login, logout, ...), und wohin sie ggf. müssen, und dann leitest du die Pakete zum Empfänger.
Prinzipiell brauchst du dann auch keine Client-Threads mehr. Die Liste mit Clients reicht aus. Der Paketdispatcher pickt sich aus der Liste einfach den Empfänger raus und ruft die senden-methode auf. Fertig.




- Alex
 

lordnikon

Mitglied
Eine Identifikation durch einen Benutzernamen ist bereits vorhanden!

Das Problem ist das in der Zeit in der wir ein eingehendes Pakete bearbeiten nichts empfangen werden kann und somit einzelne Paket verlorgen gehen.

Falls es hilfreich ist kann ich dir auch unseren Server reinposten.
 
T

tuxedo

Gast
Ja, poste mal den Abschnitt wo die Pakete empfangen werden.

- Alex

P.S.

Du solltest die Bearbeitung eines Pakets in je einen Thread stecken.
Also in einer Schleife Pakete empfangen und sofort nach dem Empfangen das Paket einem Thread in die Hand drücken und den machen lassen. Der Thread "stirbt" dann wenn er fertig ist mit dem bearbeiten.
 

lordnikon

Mitglied
Ok hier der Server

ich hoffe du kommst zurecht ;)



Code:
public static void main(String args[]) {
		try {
			serverSocket = new DatagramSocket(port);
			System.out.println("ServerCommunicator waiting for clients...");

			manager = new ChatEventManager();

			while (true) {

				DatagramPacket packet = new DatagramPacket(data, data.length);

				serverSocket.receive(packet);

				ServerCommunicator communicator = new ServerCommunicator(
						serverSocket);

				// Starten des ServerCommunicator Threads:
				communicator.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

		public ServerCommunicator(DatagramSocket incoming) {
		this.server = incoming;

	}

	/**
	 * run Methode zum starten des Threads.
	 * 
	 */
	public void run() {
		boolean finished = false;

		while (!finished) {

			DatagramPacket packet = new DatagramPacket(data, data.length);

			try {
				serverSocket.receive(packet);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			try {

					sequenceNumber = query.getSequenceNumber();

				// Adresse des Absenders für Antwort ermitteln ermitteln:
				InetAddress target = packet.getAddress();
				int port = packet.getPort();

				switch (query.getQuery()) {
				case Query.LOGIN:
					manager.login(query.getName());
					send(new Query(Query.CONFIRM, null, null), target, port);
					break;
				case Query.MESSAGE:
					manager.tell(query.getName(), query.getMessage());
					send(new Query(Query.CONFIRM, null, null), target, port);
					break;
				case Query.LOGOUT:
					manager.logout(query.getName());
					send(new Query(Query.CONFIRM, null, null), target, port);
					break;
				case Query.POLLING:
					ChatEvent evt = manager.poll(query.getName());
					if (evt != null && evt.getCommand() == ChatEvent.LOGOUT)
						finished = true;
					send(evt, target, port);

					break;

				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	} // run

	/**
	 * Sendet die Antwort an den Client
	 * 
	 * @param object
	 *            Das Antwortobjekt
	 * @param target
	 *            Der Zielhost
	 * @param port
	 *            Zielport
	 * @throws IOException
	 */
	public void send(Object query, InetAddress target, int port)
			throws IOException {

		DatagramPacket sendPacket = Settings.createSendPacket(query, target,
				port);
		server.send(sendPacket);

	}

} 
[code]
[/code]
 

lordnikon

Mitglied
Achja hab ich fast vergessen....da du vorgeschlagen hast ...hab ich schon ausprobiert.....nur leider hatten wir dann erhebliche Performance Probleme.
 
T

tuxedo

Gast
Zeile 13 bis 20 ist etwas ungeschickt formuliert. Du hast das Paket doch schon gelesen. D.h. du musst nicht den Socket (wie bei TCP) übergeben. Es reicht das Paket.

Und das kannst du in einer Zeile machen:

Code:
new PacketProcessor(packet).start();

In der run-methode ab Zeile 35:

* Wieso hast du da eine While-Schleife? Es reicht das Paket einmal abzuarbeiten und dann die run-Methode wieder zu verlassen, sprich den Thread zu beenden.
* Wo bricht die Schleifen denn ab? Abbruchbedingung?
* Und wieso liest du in Zeile 43 nochmal ein Packet? Du hast das Packet doch schon in der Main gelesen.

Der Rest sieht okay aus.

Wieviele Pakete gehen denn beim Server ein dass du da "Performanceprobleme" bekommst?

- Alex
 

lordnikon

Mitglied
Wir haben es so umgestellt das der "Haupt"thread die Pakete empfängt und dann einen Thread startet der die Bearbeitung des Threads übernimmt.

In der Zeit bei dem dieser Thread gestartet wird kann der Hauptthread keine Pakete empfangen!
 
T

tuxedo

Gast
Naja, "hexen" kann kein Programm. Du kannst ja schlecht das Starten des Bearbeitungsthreads auch noch in einem Thread auslagern.

Probier mal das starten des Barbeitsungsthread so zu verkürzen wie ich's dargestellt hab.

Die von mir aufgezählten Punkte hast du jetzt dummerweise nicht angesprochen. Wie schaut's damit aus?

Allgemein: Da UDP ja verbindungslos ist, solltest du für "wichtige" Pakete eine Eingangsbestätigung zurück an den Client schicken. Und beim client ein TimeOut einbauen: "Wenn in Zeit X keine Antwort kommt: Nochmal schicken".

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
C Frage zu Threads & Server Netzwerkprogrammierung 4
L einfacher server ohne threads Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
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
J Client-Server und SOAP Netzwerkprogrammierung 23
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

Ähnliche Java Themen


Oben