Kommunikation auf Byte-Ebene zw. C und Java via Socket

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hallo,

ich muss einen Treiberwrapper fuer eine Interfacekarte schreiben der den C-Treiber auf Java adaptiert.
Fuer die initiellen Einstellungen verwende ich JNI. Fuer die Rohdaten will ich Sockets einsetzen und das ganze somit evtl sogar noch netzwerkfaehig machen.

Sockets habe ich deshalb gewaehlt weil hier direkt und ohne Umwege kommuniziert wird. Beim Transfer kommt es auf sehr exaktes Timing und Geschwindigkeit an. Da gehen schon Megabyteweise Daten durch.

auf der C Seite kommen beim Treiber Messages an die aus mehreren Informationen bestehen die in einzelnen Variablen verpackt sind. IDs, Roh-Daten und noch ein paar Parameter.

Sagen wir eine Message besteht aus 2 Ints, 1 String und einem Byte-Array. Dies Daten muessen auf der C-Seite in den Socket rein und auf der Java-Seite aus einem Bytestream oder sowas wieder raus.

Auf beiden Seiten laufen je 2 Threads die die Daten entgegennehmen und weiterschicken. Also ein Thread fuer TX und einer fuer RX.

Kann mir jemand Tipps geben wie man aus einem Byte-Stream ind Java wieder die Informationen rausliest ? Also z.B. nacheinander wieder 2 Ints, 1 String und ein Byte-Array macht wenn auf der senden Seite ein C-Programm steht das die Daten bei sich in den socket reinfuettert?

Ein Tipp wo man sowas nachlesen kann wueder mir ja auch schon reichen.

Gruss
Alex
 

Nick H.

Bekanntes Mitglied
da biste wihl mit DataStreams am besten beraten
kannste einfach mal in der Doku nachschauen
mit denen kann man ganz einfach Integer, Strings usw. ein und auslesen
 
T

tuxedo

Gast
So, bin aum Urlaub zurueck.

Hab mir eben die DataStreams angeschaut. Sieht vielversprechend aus.
Jetzt muss ich nur noch rausfinden/testen wie das aussieht wenn der Input-Stream auf Java-Seite mit Variablen von der C-Seite aus gefuettert wird.

Gruss
Alex
 
B

Beni

Gast
Hm, bei den DataStreams kann es Probleme bezüglich little/big-endian geben.

Sofern es nicht geht, guck dir den Code der DataStreams mal an. Da steht drin, wie man aus mehreren Bytes irgendwas neues erzeugt. Damit kannst du was eigenes basteln.
 
T

tuxedo

Gast
So, habe die letzte Zeit jede Menge herumexperimentiert. Aber ich schaffs nicht einen in C in den Socket reingeschobenes Byte auf Java Seite wieder erfolgreich zu lesen, geschweige denn einzelne Typen auszulesen wie int, string, char, byte etc...

Weiss jemand wo ich Beispielcode fuer mein Problem finde? Habe vermehrt im Netz gelesen dass sowas schon gemacht wurde, doch keiner gibt Auskunft darueber wie...

- Alex
 
T

tuxedo

Gast
So, ich bin jetzt ein Stueck weiter... Ich habs geschafft einfache Integer via Socket von C nach Java zu schicken. Um das ganze eleganter zu loesen will ich auf Java-Seite nur mit Objecten arbeiten und habe vor die serialisierung manuel vor zu nehmen.

Beispiel:

Die Klasse die die zu sendenden Daten enthalten soll
Code:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Message implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public int var1;
	
	private void writeObject( ObjectOutputStream oos ) throws IOException
	  {
		System.out.println("Schreibe var1");
		oos.writeInt(var1);
	  }

	 
	  private void readObject( ObjectInputStream ois ) throws IOException
	  {
		  System.out.println("Lese var1");
		  var1=ois.readInt();
	  }
}


Kleiner Test-Server der Verbindungen entgegen nimmt, eine Int Zahl einliest, diese in das Message-Object steckt und die Message wieder zurueck-serialisiert in die Leitung steckt...
Code:
import java.net.*;
import java.io.*;

public class Server
{
	public static void main( String args[] ) throws ClassNotFoundException {
		ServerSocket server;
		Socket client = null;
		try {
			server = new ServerSocket( 2000 );


			while ( true ) {
				System.out.println("Warte auf Clientverbindung...");
				client = server.accept();
				System.out.println("Client "+client.getInetAddress().getHostAddress()+" hat sich mit uns verbunden...");
				
				System.out.println("Erzeuge Streams...");
				
				
				
				InputStream  is  = client.getInputStream();
					System.out.println("\tInputStream erzeugt");
				OutputStream os = client.getOutputStream();
					System.out.println("\tOutputStream erzeugt");
				
				ObjectOutputStream out = new ObjectOutputStream(os);
					System.out.println("\tObjectOutputStream Stream erzeugt");
				ObjectInputStream in = new ObjectInputStream(is);
					System.out.println("\tObjectInputStream Stream erzeugt");
				
					
					
				Message m = new Message();
				m.var1=0;
				
				int start=-1;
				while (true){
					try {      
						System.out.print("Lese Message...");
						
						Object o = in.readObject();
						if (o==null) break;
						m = (Message) o;
						
						System.out.println("Gelesen: '"+m.var1+"'");
						
						System.out.print("Schreibe Message...");
						out.writeObject(m);
						System.out.println("fertig...");
						
					} catch (IOException e) {
						e.printStackTrace();
						System.exit(0);
					} 
					
					
				}
			}
		} 
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			client.close();
		} 
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


Kleiner C-Test-Client der den Int "msg" versendet und auf die Antwort wartet...
Code:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <winsock.h>

#define BUF_SIZ	4096

void cut(char *s)
{
	while (*s && (*s != '\r') && (*s != '\n'))
		s++;
	*s = '\0';
}


int main(int argc, char *argv[])
{
	struct sockaddr_in addr;
	struct hostent *host;
	int s;
	int i=0;
	int msg=321;
	int rcvlen;
	char buf[1024];
	WSADATA	wsa;

	if (argc != 3)
	{
		fprintf(stderr, "usage: %s <Host> <Port>\n", argv[0]);
		return 1;
	}

	if (WSAStartup(MAKEWORD(1, 1), &wsa))
	{
		fprintf(stderr, "WSAStartup() failed: %lu\n", WSAGetLastError());
		return 2;
	}

	if ((addr.sin_addr.s_addr = inet_addr(argv[1])) == -1)
	{
		host = gethostbyname(argv[1]);
		if (!host)
		{
			fprintf(stderr, "gethostbyname() failed: %lu\n", WSAGetLastError());
			return 3;
		}
		addr.sin_addr = *(struct in_addr*)host->h_addr;
	}

	if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1)
	{
		fprintf(stderr, "socket() failed: %lu\n", WSAGetLastError());
		return 4;
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(atol(argv[2]));

	printf("connecting to %s\n", inet_ntoa(addr.sin_addr));
	if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) == -1)
	{
		fprintf(stderr, "connect() failed: %lu", WSAGetLastError());
		return 5;
	}

	
	
	if (send (s, &msg, 1, 0) == -1) {
		perror ("Fehler beim senden send()");
	}


	rcvlen=recv (s, buf, 1024, 0);

	printf("rx length: %i\n",rcvlen);

	for (i=0;i<rcvlen;i++){
		printf("%u ",buf[i]);
	}
 



	Sleep(5000);
	closesocket(s);

	return 0;
}

Doch irgendwie schafft es Java nicht den ObjectInputStream zu erzeugen:

Warte auf Clientverbindung...
Client 127.0.0.1 hat sich mit uns verbunden...
Erzeuge Streams...
InputStream erzeugt
OutputStream erzeugt
ObjectOutputStream Stream erzeugt
java.io.EOFException
at java.io_ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io_ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io_ObjectInputStream.readStreamHeader(Unknown Source)
at java.io_ObjectInputStream.<init>(Unknown Source)
at Server.main(Server.java:29)

Any ideas why ?

gruss
Alex
 
T

tuxedo

Gast
Antwort gefunden...

Beim erstellen eines ObjectOutputStreams sendet Java auf Byte-Ebene irgendwelchen Infos ueber den Socket. Auf der anderen Seite auf der ein ObjectInputStream erzeugt wird wird auf diese Information gewartet.

Ich habe nun jetzt versucht einen ObjectInputStream auf Java-Seite zu erzeugen. Java wartet nun auf Infos von der anderen Seite bzgl des ObjectInputStreams, erwartet also einen ObjectOutputStream...

In C habe ich sowas allerdings nicht und Java bricht irgendwann beim Stream erzeugen ab da die falschen (oder keine) Informationen ankommen.

Werde es jetzt so loesen:

Eine Message-Klasse die writeData und readData kennt und mit denen ich meine Informationen aehnlich dem eigenen serialisieren mittels writeInt/Char/String/Byte sende und empfange.

Denke das sollte gehen.

Gruss
Alex
 
T

tuxedo

Gast
Jupp, das geht. Wenn man dann noch weiss dass Java die Integer in einer anderen Bytereihenfolge benutzt klappt das auch ganz gut :)

- Alex
 
G

Gast

Gast
Das ist die nur bei Java so, sondern das sind verallgemeinerte konventionen ! :)
 
T

tuxedo

Gast
Bringt mir nur nix wenn es eine Konvention ist und C und Java sich nicht BEIDE dran halten. Es funktioniert jedenfalls :)

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
G Socket Socket Kommunikation Netzwerkprogrammierung 1
R Kommunikation zwischen Shell und Putty Netzwerkprogrammierung 5
temi (Netzwerk-) Kommunikation zwischen Anwendungen. Wie? Netzwerkprogrammierung 5
T Client zu Client Kommunikation Netzwerkprogrammierung 2
K Socket Nur bestimmte Zeichen als Kommunikation zulassen Netzwerkprogrammierung 1
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
H Android - PC kommunikation Netzwerkprogrammierung 3
S Server Kommunikation Netzwerkprogrammierung 1
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
M Kommunikation übers Internet Netzwerkprogrammierung 9
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
M Socket Verschlüsselte Kommunikation - Fehler Netzwerkprogrammierung 1
I Interne Computer Kommunikation Netzwerkprogrammierung 6
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
R Server zu Client Kommunikation Netzwerkprogrammierung 11
V Socket UDP Server/Client Kommunikation sehr langsam Netzwerkprogrammierung 2
Y HTTP Google Reader API Kommunikation Netzwerkprogrammierung 3
C Socket Kommunikation mit SMTP-Server Netzwerkprogrammierung 4
J Kommunikation von Webanwendungen (auf Tomcat Server) untereinander Netzwerkprogrammierung 8
H Kommunikation Netzwerkprogrammierung 8
F Socket Server/Client Kommunikation Netzwerkprogrammierung 4
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
E Zeitgleiche Kommunikation, mögliche Ansätze Netzwerkprogrammierung 17
1 Java to Android TCP Kommunikation Netzwerkprogrammierung 2
O php - applet Kommunikation Netzwerkprogrammierung 9
D HTTP Java HTTP Kommunikation Netzwerkprogrammierung 9
1 SSH-Kommunikation - Ende eines Streams nicht erkenntlich Netzwerkprogrammierung 2
R Kommunikation TCP + UDP Netzwerkprogrammierung 3
S RMI RMI-Applet kommunikation funktioniert nicht Netzwerkprogrammierung 8
1 Kommunikation mit externem Programm über TCP Netzwerkprogrammierung 2
D Server-Client (Web) Kommunikation Netzwerkprogrammierung 9
E Client-Server-Kommunikation Netzwerkprogrammierung 13
C HTTP Studienarbeit Kommunikation via HTTP mit POST zwischen Server und Client Netzwerkprogrammierung 7
DamienX Socket Asnchrone Kommunikation Netzwerkprogrammierung 5
Raidri Rückwertige RMI Kommunikation Netzwerkprogrammierung 6
S TCP/IP-Kommunikation ist zu langsam Netzwerkprogrammierung 13
M Kommunikation zwischen ServerSocket und Socket Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
G java asynchrone kommunikation Netzwerkprogrammierung 8
B Rmi Kommunikation Server zu mehreren Clients? Netzwerkprogrammierung 3
G Problem mit Client-Server Kommunikation Netzwerkprogrammierung 4
N Servlet-RMI Kommunikation Netzwerkprogrammierung 8
G Objecte für Kommunikation nutzen Netzwerkprogrammierung 2
L http kommunikation mit und ohne multipart Netzwerkprogrammierung 4
D Einfache Applet-Servlet-Kommunikation Netzwerkprogrammierung 5
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
RaoulDuke RMI Kommunikation Java <-> Perl Netzwerkprogrammierung 7
M Servlet - Applet Kommunikation Netzwerkprogrammierung 3
S Kommunikation zweier Java-Programme Netzwerkprogrammierung 6
J client/server kommunikation Netzwerkprogrammierung 3
M Client-Kommunikation ohne Server Netzwerkprogrammierung 7
S Kommunikation Fortran <-> Java auf Client-Server-Archi Netzwerkprogrammierung 2
J Kommunikation zw. Server und mehreren Clints haut nicht hin Netzwerkprogrammierung 2
K Socket Kommunikation Netzwerkprogrammierung 3
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
R applet servlet kommunikation Netzwerkprogrammierung 2
G JINI über RMI // Client-Server Kommunikation Netzwerkprogrammierung 4
D Kommunikation zwischen mehreren Servlets??? Netzwerkprogrammierung 3
x46 Byte-Array per for-Schleife schicken Netzwerkprogrammierung 1
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
D Socket Gute Idee?: File als byte[] per ObjectIOStream übertragen Netzwerkprogrammierung 3
M TCP Verbindung Byte-weise lesen? Netzwerkprogrammierung 5
C Byte Stream dekodieren Netzwerkprogrammierung 7
W Socket Byte Array senden Netzwerkprogrammierung 2
M Byte Array kommt nicht an Netzwerkprogrammierung 0
N Paket-Analysieren Byte-Streams Netzwerkprogrammierung 12
K Socket byte Schleife beendet nicht Netzwerkprogrammierung 9
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
B Socket Byte-array Komprimieren Netzwerkprogrammierung 3
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
J byte[] auf Stream schreiben Netzwerkprogrammierung 2
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
E RTP Packet lesen - Byte Problem 0xFFFFFF80 statt 0x80 Netzwerkprogrammierung 7
V Zuweisen einer InetAddress mit einem byte Netzwerkprogrammierung 5
D Byte-Zähler des Netzwerkinterface auslesen Netzwerkprogrammierung 2
B HEX String zu einem Byte Array ? *verzweiflung* :( Netzwerkprogrammierung 16
H Byte-Codierung bei Socket-Verbindung ändern Netzwerkprogrammierung 8
8 Socket Streams nur mit Byte? Netzwerkprogrammierung 2
G binärwert aus 2 byte auslesen Netzwerkprogrammierung 7
O Ip-String in byte[]-Array umwandeln? Netzwerkprogrammierung 3
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
O JAVA hängt bei Dateikopie über LAN ein Byte an!!! ARGH Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben