Objekte über DatagramSocket versenden

Status
Nicht offen für weitere Antworten.

paedubucher

Aktives Mitglied
Hallo allerseits

Ich schreibe eine kleine Chat-Applikation um mich etwas in die Netzwerk-, Multithreading- und GUI-Programmierung einzuarbeiten. Beim Netzwerkteil habe ich mich für DatagramSockets, also UDP-Packages, entschieden.

Nun kann ich einem UDP-Package (DatagramPackage) immer einen Datenbuffen als byte-Array mitgeben. Ich möchte aber nicht nur eine Nachricht, sondern auch Informationen wie der Absender (ein frei wählbarer Name, nicht die Absender-Adresse) mitgeben können. Natürlich könnte ich einen strukturierten String verschicken, diesen muss ich aber zuerst verketten und beim Empfänger wieder zerschnippeln. Das gehört IMHO nicht in ein Java-Programm, das sollte man doch bestimmt objektorientiert lösen können, oder?

Nun habe ich daran gedacht, eine Klasse Namens 'Message' oder etwas in der Art zu erstellen, welche den Absendernamen, das Absendedatum und natürlich die Nachricht enthält... vielleicht kommt ja später noch etwas dazu. Kann ich die Klasse irgendwie serialisieren, sodass ich einen String erhalte, aus dem man auf der anderen Seite wieder ein Objekt zusammenschustern kann? Ich habe etwas gesucht und zur Serialisierung nur Beispiele gefunden, wo ein Objekt mit einem Object-Irgendwas-Stream auf die Festplatte geschrieben und danach wieder gelesen wird. Kann ich das statt auf die Fesplatte irgendwie in einen String hineinschreiben?

Ist Serialisierung überhaupt der richtige Weg?

Bitte klärt mich auf...

Danke & Gruss

Patrick
 

cowabunga1984

Aktives Mitglied
Servus :)

der Post von paedubucher ist zwar schon sehr lange her, aber da ich mich gerade das gleiche Frage pushe ich einfach mal den Thread. Vielleicht antwortet ja mal jemand :D

Gruß
cowabunga
 
S

SlaterB

Gast
in ObjectOutoutStream kann, wenn nicht direkt in einen UDP-Stream, in einen ByteArrayOutputStream münden, der am Ende ein byte[] draus macht,

dieses byte[] wird man doch wohl versenden können, oder notfalls in String umwandeln,
auf der Gegenseite dann wieder zu byte[], ByteArrayInputStream, ObjectInputStream
 

cowabunga1984

Aktives Mitglied
So, habs mal implementiert. Hier der Code-Ausschnitt:

Server:
Code:
		DatagramPacket paket = new DatagramPacket(new byte[length], length);
		new DatagramSocket(1234).receive(paket);

		Message message = (Message) new ObjectInputStream(new ByteInputStream(
				paket.getData(), length)).readObject();

Client:
Code:
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		new ObjectOutputStream(byteStream).writeObject(message);

		new DatagramSocket().send(new DatagramPacket(byteStream.toByteArray(),
				byteStream.toByteArray().length, InetAddress
				.getByName("localhost"), 1234));

Auf den Code der Message-Klasse hab ich mal verzichtet. Das einzige was zu beachten ist, ist eigendlich dass die Klasse serializeable ist. Ausserdem darf die Message nicht zu groß sein, da sie sonst nicht in EINEM Packet verschickt werden kann...

cowabunga! :D
 
M

mathilda

Gast
hallo,
wie sichert man ab, ob die message wirklich angekommen ist? könnte man noch ACKs einbauen?lg
 

0din

Bekanntes Mitglied
Auf den Code der Message-Klasse hab ich mal verzichtet. Das einzige was zu beachten ist, ist eigendlich dass die Klasse serializeable ist. Ausserdem darf die Message nicht zu groß sein, da sie sonst nicht in EINEM Packet verschickt werden kann...

cowabunga! :D

Was is denn die maximale größe für ein Packet?
Was is wenn das Packet doch größer is?
Wird das automatisch aufgeteilt oder Exception?​
Was is bei dem code bsp oben bitte length beim Client?
Weil, wenn ich die nich genau angebe, bekomme ich keine reaktion. Kann man das nich allgemeiner lösen?​
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Kann man das nich allgemeiner lösen?[/INDENT]

Verwende TCP statt UDP. Für einen simplen Chat ist das x-mal einfacher. Allein schon die gesicherte Zustellung und Reihenfolge der Pakete ist bei TCP von Vorteil.

UDP würd ich nur für Realtime-Informationen wie Audio und Video nutzen.
 

HoaX

Top Contributor
Weiso kramt ihr einen Thread aus der über ein halbes Jahr alt ist? Naja, jedenfalls kann es auch passieren dass das Paket unterwegs von einem Router gesplittet wird, nicht nur lokal, man kann also nie wirklich sagen wie groß ein Paket maximal sein darf.
 

0din

Bekanntes Mitglied
Es geht mir weniger um das "Is das Sinnig?" es geht mir ums verstehen, gebrauchen, anwenden. Im mom will ich garkeine sinnigen kompletten/komplexe progs schreiben sondern einfach mal n wenig rum probieren un schaun wie ich dinge im netzwerk mache. (kommt bei mir innem monat inner uni dran un ich bin neugierig) :oops:

Un um den folge zu leisten,
mir kommt grad in den sinn dasset dabei nur drum geht wie groß das array is. Für das senden macht das doch eig keinen unterschied weil der router ja zusehn muss wie er das heil rüber bekommt?!


Weiso kramt ihr einen Thread aus der über ein halbes Jahr alt ist? Naja, jedenfalls kann es auch passieren dass das Paket unterwegs von einem Router gesplittet wird, nicht nur lokal, man kann also nie wirklich sagen wie groß ein Paket maximal sein darf.

1. Da gebraucht man die SuFu un dann wird immerno gemeckert... :autsch:
2. Folglich spielt es keine rolle wie groß ich ein paket mache weils eh zerstückelt wird?
 
T

tuxedo

Gast
. Für das senden macht das doch eig keinen unterschied weil der router ja zusehn muss wie er das heil rüber bekommt?!

Deine Frage impliziert dass der Router sich um die korrekte übertrragung kümmert. Dem ist nicht so. Der Router schickts halt. Ihm ist es völlig schnuppe ob er's selbst fragmentiert (wieso auch immer), oder ob's verloren geht.

Um das "heil rüber bekommen" musst du selbst mit einem passenden Protokoll sorgen.

2. Folglich spielt es keine rolle wie groß ich ein paket mache weils eh zerstückelt wird?

".. zerstückelt werden kann". Korrekt. Du musst dich selbst drum kümmern dass man mit den Daten die ankommen noch etwas anfangen kann. Weil unterwegs können bei UDP

* Pakete verloren gehen
* zerstückelt werden (und dann davon teile verloren gehen)
* in einer total anderen Reihenfolge ankommen

Gibt also jede Mange Nachteile für UDP. Aber einen Vorteil hat es: Es ist schlank, und deshalb etwas schneller als TCP, weswegen es für Echtzeitübertragungen gern genommen wird da hier dann die Latenzen etc. am besten sind. Für alles andere gibt's TCP.

Mehr dazu gibts u.a. bei Wikipedia.

- Alex

- Alex
 

0din

Bekanntes Mitglied
Das is doch mal ne antwort... :)

Du musst dich selbst drum kümmern dass man mit den Daten die ankommen noch etwas anfangen kann.

Dazu hab ich nu eine frage;
Ich hab gelernt das, beim verlust, das entsprechende paket nochmal gesendet wird.
Un was du nu schreibst, würde für mich heißen "ich muss schaun das alles ankommt und neu anfragen wenns nich der fall ist"
Lange Rede wenig Sinn, die pakete (vom router) muss ich noch auf vollständigkeit prüfen und in die richtige reihenfolge setzten?
 
T

tuxedo

Gast
Ich hab gelernt das, beim verlust, das entsprechende paket nochmal gesendet wird.

Bei UDP: Nein. Das erneute senden musst du über dein eigenes Protokoll "veranlassen".
bei TCP: Es gehen keine Pakete verloren. Und wenn doch kümmert sich TCP selbst drum dass das Paket nochmal geschickt wird.

Un was du nu schreibst, würde für mich heißen "ich muss schaun das alles ankommt und neu anfragen wenns nich der fall ist"

Nö, das hatte ich nicht geschrieben.

Lange Rede wenig Sinn, die pakete (vom router) muss ich noch auf vollständigkeit prüfen und in die richtige reihenfolge setzten?

Grob gesagt ja.

Da du's offensichtlich noch nicht bis Wikipedia geschafft hast:

UDP:
http://de.wikipedia.org/wiki/User_Datagram_Protocol#Eigenschaften hat gesagt.:
UDP stellt einen verbindungslosen, nicht-zuverlässigen Übertragungsdienst bereit. Das bedeutet, es gibt keine Garantie, dass ein einmal gesendetes Paket auch ankommt, dass Pakete in der gleichen Reihenfolge ankommen, in der sie gesendet wurden, oder dass ein Paket nur einmal beim Empfänger eintrifft. Eine Anwendung, die UDP nutzt, muss daher gegenüber verlorengegangenen und unsortierten Paketen unempfindlich sein oder selbst entsprechende Korrekturmaßnahmen beinhalten.

Da vor Übertragungsbeginn nicht erst eine Verbindung aufgebaut zu werden braucht, können die Partner schneller mit dem Datenaustausch beginnen. Das fällt vor allem bei Anwendungen ins Gewicht, bei denen nur kleine Datenmengen ausgetauscht werden müssen. Einfache Frage-Antwort-Protokolle wie das Domain Name System verwenden UDP, um die Netzwerkbelastung gering zu halten und damit den Datendurchsatz zu erhöhen. Ein Drei-Wege-Handshake wie bei TCP für den Aufbau der Verbindung würde unnötigen Overhead erzeugen.

Daneben bietet die ungesicherte Übertragung auch den Vorteil von geringen Übertragungsverzögerungsschwankungen: Geht bei einer TCP-Verbindung ein Paket verloren, wird es automatisch neu angefordert. Das braucht Zeit, die Übertragungsdauer kann daher schwanken, was für Multimediaanwendungen schlecht ist. Bei VoIP z. B. käme es zu plötzlichen Aussetzern, bzw. die Wiedergabepuffer müssten größer angelegt werden. Bei verbindungslosen Kommunikationsdiensten bringen verlorengegangene Pakete dagegen nicht die gesamte Übertragung ins Stocken, sondern vermindern lediglich die Qualität.

UDP übernimmt die Eigenschaften der darunterliegenden Vermittlungsschicht. Im Falle des Internet Protocols (IP) können Datenpakete maximal 65535 Bytes lang sein, wovon der IP-Header und UDP-Header insgesamt mindestens 28 Bytes belegen. UDP-Datagramme haben daher maximal 65507 Nutzdatenbytes. Solche Pakete werden jedoch von IP fragmentiert übertragen.

IP löscht Pakete etwa bei Übertragungsfehlern oder bei Überlast. Datagramme können daher fehlen. UDP bietet hierfür keine Erkennungs- oder Korrekturmechanismen, wie etwa TCP. Im Falle von mehreren möglichen Routen zum Ziel kann IP bei Bedarf neue Wege wählen. Dadurch ist es in seltenen Fällen möglich, dass später gesendete Daten früher gesendete überholen. Außerdem kann ein einmal abgesendetes Datenpaket mehrmals beim Empfänger eintreffen.

TCP:
http://de.wikipedia.org/wiki/Transmission_Control_Protocol hat gesagt.:
Im Unterschied zum verbindungslosen UDP (User Datagram Protocol) stellt TCP einen virtuellen Kanal zwischen zwei Endpunkten einer Netzverbindung (Sockets) her. Auf diesem Kanal können in beide Richtungen Daten übertragen werden. TCP setzt in den meisten Fällen auf das IP (Internet-Protokoll) auf, weshalb häufig (und oft nicht ganz korrekt) auch vom „TCP/IP-Protokoll“ die Rede ist. Es ist in Schicht 4 des OSI-Referenzmodells angesiedelt.

Aufgrund seiner vielen angenehmen Eigenschaften (Datenverluste werden erkannt und automatisch behoben, Datenübertragung ist in beiden Richtungen möglich, Netzüberlastung wird verhindert usw.) ist TCP ein sehr weit verbreitetes Protokoll zur Datenübertragung. Beispielsweise wird TCP als fast ausschließliches Transportmedium für das WWW, E-Mail und viele andere populäre Netzdienste verwendet.

Das sollte für's erste reichen ....

-Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
I Objekte über das Netzwerk Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
T JSON-Objekte richtig parsen Netzwerkprogrammierung 8
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
C List Deserialisierung entfernt Objekte Netzwerkprogrammierung 2
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
S Socket Über UDP Objekte verschicken Netzwerkprogrammierung 9
B Eigene Objekte per RMI übergeben Netzwerkprogrammierung 2
S Kapselung der Netz-Objekte Netzwerkprogrammierung 3
B verschiedene Serialisierte Objekte identifizieren? Netzwerkprogrammierung 5
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client? Netzwerkprogrammierung 4
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
M Messenger - String oder Objekte Netzwerkprogrammierung 4
S Netzwerk und Objekte Netzwerkprogrammierung 5
S RMI 1.) Entfernte Objekte "Zwischenspeichern" 2.) Threadsicherheit Netzwerkprogrammierung 2
T rmi ssl zu große Objekte übergeben -> Exception Netzwerkprogrammierung 10
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
N RMI und Datenbank Objekte Netzwerkprogrammierung 3
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
M Objekte senden zwischen Java und PHP mit SOAP Netzwerkprogrammierung 9
A Objekte in übergebenen Objekten mit WebServices? Netzwerkprogrammierung 6
A RMI wie kann ich objekte übergeben? Netzwerkprogrammierung 5
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5

Ähnliche Java Themen


Oben