ByteBuffer - Client/Server

aknayirp

Mitglied
Hey,

ich weiß nicht genau wie ich dir Frage formulieren soll, aber ich versuche es mal so: ich blicke beim ByteBuffer nicht ganz durch. Ok, das war nicht sehr aufschlussreich...

Also wenn ich mit Sockets arbeite und ein Client-Server Verbindung aufstellen möchte, dann ist es, so weit ich weiß, möglich mit dem ByteBuffer diese Nachrichten umzuwandeln dann mit put() in den Buffer zu tun und abzuschicken.
Jetzt ist erstmal meine Frage ob das soweit richtig wäre?

Ich verstehe auch nicht wieso man überhaupt ByteBuffer benutzen sollte, da ich doch für Nachrichten z.B. BufferedReader benutzen könnte, oder?

MFG
Aknayirp
 

MisterBu

Aktives Mitglied
Die Frage ist was du tun willst? Willst du einen Client oder einen Server programmieren? Falls Client, bist du davon abhängig, was der Server dir anbietet. Es werden in jeden Fall Bytes übertragen. Wenn du die mit einem BufferedReader einliest, interpretierst du die Bytes bereits als ASCII Zeichen und gibst einen Zeichensatz vor.
 

aknayirp

Mitglied
Also ich will erstmal den Client programmieren. Der Server hat auf einer Datenbank Daten gespeichert, z.b. Adressen. Und der Client schickt Anfragen, z.B. alle Adressen an Client schicken, eine Adresse modifizieren, löschen oder neuen Eintrag hinzufügen.
Also wenn du was anderes meintest mit "Server anbietet", dann sach Bescheid.

Wenn ich einen Eintrag hinzufügen möchte, dann habe ich ein Objekt von der Klasse Adresse und dieses hat Integer, Strings usw als Variablen, wie würde ich das jetzt per Socket und ByteBuffer senden?

Edit: Vllch sollten wir mal etwas kleiner Anfangen. Wenn ich jetzt einen String habe z.B. "Hallo" oder so. Wie verschicke ich das dann per ByteBuffer? Ich schreibe später mal ein Beispiel rein, wie ich es mir denke.
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Im Grunde musst du nur den String in ein Byte Array umwandeln und in den buffer stecken. Ganz simpel kann es z.B. so aussehen:
Java:
buffer.put(myString.getBytes());
Allerdings musst du bedenken, dass der Empfänger gar nicht weiß wie lang denn der String sein soll.
Um das zu beheben, kannst du z.B. die Länge des Strings voranstellen:
Java:
buffer.putInt(myString.length());
buffer.put(myString.getBytes());
Der Empfänger kann dann erst einmal die Länge auslesen und anschließend entsprechend viele Bytes für den String.


Für dich könnte vielleicht auch Google Protocol Buffers interessant sein.
Man definiert in einer DSL wie denn Nachrichten aussehen und protoc erzeugt daraus Java Code der effizient diese Nachrichten (de-)serialisieren kann.
ProtoBuf
 

aknayirp

Mitglied
Hey,

danke für deine Hilfe erstmal.

Also den Client habe ich zum Testen erstmal so:

Code:
public class App_Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		String test = "Hallo";
		
		int length;
	
		length = test.getBytes("UTF-8").length;
		ByteBuffer buf = ByteBuffer.allocate(length);
		
		buf.putInt(test.length());
		buf.put(test.getBytes());
		
		Socket s = new Socket("127.0.0.1", 8080);
		InputStream in = s.getInputStream();
		OutputStream out =  s.getOutputStream();
		
		out.write(buf.array());
		
		s.close();
		in.close();
		out.close();
		
	}
}

So jetzt habe ich noch versucht den Server zu schreiben, aber bin mir da bei der Vorgehensweise nicht ganz sicher.
Das sieht grad so aus:

Code:
public class App_Server {
	public static void main(String[] args) throws IOException{
		ServerSocket s = new ServerSocket(8080);
		
		Socket connection = s.accept();
		
		InputStream in = connection.getInputStream();
		OutputStream out = connection.getOutputStream();
		
		ByteBuffer buf = ByteBuffer.allocate(capacity) // ???
		
		in.read(buf.array()) // ???

		
		in.close();
		out.close();
		s.close();
	}
}

Du hast geschrieben ich könnte erstmal die Länge auslesen um dann entsprechen viele Bytes auslesen zu können.
Aber muss ich nicht vorher den buf allocaten um buf.array() beim in.read() zu benutzen, wie oben dargestellt? Aber woher soll ich vorher die Größe für das allocate wissen?
Reicht dann am Ende ein, buf.getInt(); ?
Danke schonmal,
Ihr seid ne super Hilfe:D
 

InfectedBytes

Top Contributor
Die ersten vier Byte enthalten die Länge des Strings, d.h. du kannst erstmal nur die ersten vier Byte lesen, daraus dann die Textlänge bestimmen und anschließend einen Buffer erstellen der groß genug für den Text ist.

Häufig dimensioniert man jedoch bereits ein Array vor, welches groß genug ist, um die Daten zu halten. Dies geht natürlich nur, wenn man bereits ne grobe Schätzung hat, wie groß die Daten werden können.
Du könntest nun z.B. einen 1KB großen Buffer erstellen und erstmal füllen.
Dann kannst du dir deine Daten aus dem Buffer holen
 

aknayirp

Mitglied
Moin,

also ich habe noch eine generelle Frage. Wenn ich eine Klasse habe mit mehreren Variablen, die Integer und String beinhalten, kann ich die dann alle in einem Buffer unterbringen?
Du meintest die ersten 4 Byte geben die Länge des Strings an, aber wenn ich mehrere Strings habe und Integer, ist das dann überhaupt möglich, die in ein ByteBuffer unterzubringen?
 

InfectedBytes

Top Contributor
Natürlich, du kannst in dein ByteBuffer reinschreiben was du willst.
Du kannst mit put solange beliebige Sachen in den Buffer legen, wie dieser noch nicht voll ist.
Natürlich müssen Sender und Empfänger beide wissen wie so eine Nachricht aufgebaut ist. D.h. sie müssen beide wissen in welcher Reihenfolge die einzelnen Elemente in der Nachricht stehen.
Angenommen du hast zwei Strings und einen Integer.
Der Sender legt dann z.B. erst die beiden String (inkl. länge) in den Buffer und danach den int.
Der Empfänger liest erstmal alles in einen großen Buffer und liest dann zwei Strings aus, und danach den int.

Falls du mehrere verschiedene Nachrichten hast, sieht das dann noch ein ganz kleines bisschen anders aus.

Aber grundsätzlich würde ich dir schon Google ProtoBuf empfehlen, da all diese Sachen dort schon integriert sind.
 

aknayirp

Mitglied
Yo abend,

alter, vielen Dank, warst mir bis jetzt echt eine große Hilfe:D Jetzt blicke ich langsam durch.
Habe ein Beispiel und dort haben die das mit dem ByteBuffer gemacht und deshalb wollte ich das verstehen und nicht einfach den Google ProtoBuf benutzen. Aber wenn ich mit dem ByteBuffer durch bin, dann zieh ich mir den auch mal rein.

Ich versuche mich jetzt mal mit dem Wissen an eine größere Aufgabe und schreibe nochmal, wenn ich Probleme haben sollte.

Aber eine Frage habe ich noch, die hat aber nicht unbedingt was mit dem ByteBuffer zu tun. Ich hoffe es ist in Ordnung, wenn ich diese hier kurz stelle und nicht unbedingt einen neuen Thread aufmachen muss.
Ich möchte mit der Funktion
Code:
long time = System.currentTimeMillis()
, welches ja in einem Long gespeichert ist, die Zeit angeben. Wie funktioniert das genau? Also wenn ich jetzt z.B.
Code:
System.out.println(TimeUnit.MILLISECONDS.toDays(time));

benutze dann berechnet er mir ja die Tage von 1970 bis jetzt, wenn ich mich nicht irre. Aber wie kann ich den heutigen Tag angeben?
Möchte halt in Jahr, Monat usw angeben können. Ist das möglich? Da ich das über den ByteBuffer schicken möchte, wäre long ideal.

Edit: Also für das Jahr könnte ich ja das so schreiben:

Code:
System.out.println(TimeUnit.MILLISECONDS.toDays(time)/365+1970);

Ist das aber die einzige Möglichkeit oder gibt es einfacherer vorgefertigte Funktionen? Ansonsten könnte ich ja selber Funktionen definieren, die das berechnen für den heutigen Tag usw.
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Mit Java8 ist auch endlich mal eine vernünftige Date/Time API dazu gekommen^^
Falls du also Java8 nutzt, kannst du beispielsweise LocalDate verwenden:
Java:
LocalDate date = LocalDate.now();
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B SocketChannel ByteBuffer Bilder verschicken Netzwerkprogrammierung 17
M Eingehender ByteBuffer mit unbestimmter Größe Netzwerkprogrammierung 2
A String per ByteBuffer empfangen? Netzwerkprogrammierung 6
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten 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
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur 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
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
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
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
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
J Client - Serversocket Netzwerkprogrammierung 1
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
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
J Client Server - Serialisierung Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben