# Socketverbindung zwischen Javaclient und C-Server



## joergh (20. Nov 2007)

Hallo!
Wusste nicht, wo ich dieses Theam reinschreiben soll, hätte auch genauso gut ins C-forum gepasst, aber ich probiere es mal so:

Ich möchte eine Socketverbindung zwischen Java und C schaffen. Hier mein problembehafteter Code:

Java-Client:

```
while(connect){
        try{
            labviewClient = new Socket(InetAddress.getByName(labviewIP),labviewPort);
            outStream = new ObjectOutputStream(labviewClient.getOutputStream());
            outStream.flush();
            inStream = new ObjectInputStream(labviewClient.getInputStream());
            connect = false;
        }
        catch(Exception e){
            System.out.println(+e);
        }
    }
       
    try{
        String toSend = "f";
        sendData(toSend);
    }
    catch(NullPointerException n){}
```

C-Server

```
if (!AfxSocketInit())
    {
        fprintf(stderr, "could not init\n");
        return 1;
    }

   acceptSocket = new(CSocket);

   if (!acceptSocket->Create(5555))
    {
        err = acceptSocket->GetLastError(); //just for debugging
        fprintf(stderr, "could not create socket: %d\n", err);
        return 1;
    }
    if (!acceptSocket->Listen()) // we just wait for ONE connection
    {
        err = acceptSocket->GetLastError(); //just for debugging
        fprintf(stderr, "could not listen to socket\n");
        return 1;
    }
    if (!acceptSocket->Accept(*refreshSocket)) // no waiting partner
    {
        err = acceptSocket->GetLastError();
        fprintf(stderr, "could not accept socket");
        return 1;
    }

    bool first = true;
    int length = 1400;
    char buff[1400];
    while(first)
    {
        if(recv(*refreshSocket, buff, length, 0))
        {
            if(buff[0] == 'f')
            {
                first = false;

                closeSocket(refreshSocket);
                closeSocket(acceptSocket);

            }
        }
    }
```
Die Verbindung klappt und der C-Server läuft auch schon freudig vor sich hin. Der java-Client hingegen nicht. Er wartet bei der zeile
	
	
	
	





```
inStream = new ObjectInputStream(labviewClient.getInputStream());
```
 und läuft nicht weiter.
Was muss ich auf der Serverseite machen? Oder liegt mein Problem wo anders?

Vielen Dank für Eure Hilfe!
ulli


----------



## HoaX (20. Nov 2007)

ein objectinputstream erwartet eine entsprechende formatierung der daten die dein server nicht liefert (davon geh ich einfach mal aus).

der objectinputstream liest im konstruktor schon den header des stream, den der server nicht liefert (ich sehe keine zeile die sendet, ind ein read beim inputstream wartet bis endlich was zum lesen da ist).


----------



## joergh (21. Nov 2007)

HoaX hat gesagt.:
			
		

> ein objectinputstream erwartet eine entsprechende formatierung der daten die dein server nicht liefert (davon geh ich einfach mal aus).
> 
> der objectinputstream liest im konstruktor schon den header des stream, den der server nicht liefert (ich sehe keine zeile die sendet, ind ein read beim inputstream wartet bis endlich was zum lesen da ist).



ich hab jetzt mal in Zeile 28:

```
send(acceptSocket ,"hallohallo",10,1);
```

Eingefügt. Das bringt immerhin einen Teilerfolg: java wirft folgende Exception:


```
java.io.StreamCorruptedException: invalid stream header: 68616C6C
```


----------



## thE_29 (21. Nov 2007)

ObjectInpustream erwartet OBJEKTE (wie der Name schon sagt)
Nimm nen normalen INput/Outputstream dann sollte das ganze auch klappen!


----------



## joergh (21. Nov 2007)

thE_29 hat gesagt.:
			
		

> ObjectInpustream erwartet OBJEKTE (wie der Name schon sagt)
> Nimm nen normalen INput/Outputstream dann sollte das ganze auch klappen!



Habs dann mit DataInputStreams probiert und das bringt mich schon weiter - Programm läuft zwar noch nicht wie ich es will, aber das wird wohl noch.

Recht herzlichen Dank!


----------



## HoaX (21. Nov 2007)

auch der datainputstream hat sein eigenes format. wenn du z.B. einen string sendest wird dessen länge zuvor gesendet. nimm lieber direkt den inputstream, wie schon gesagt


----------



## joergh (21. Nov 2007)

HoaX hat gesagt.:
			
		

> auch der datainputstream hat sein eigenes format. wenn du z.B. einen string sendest wird dessen länge zuvor gesendet. nimm lieber direkt den inputstream, wie schon gesagt



Okay, jetzt hänge ich aber... google bringt nichts... Der Inputstream muss ja nun irgendwie auf den Socket bezogen werden.
Analog

```
inStream = new InputStream(labviewClient.getInputStream());
```
funktioniert es nicht....


----------



## HoaX (21. Nov 2007)

schau doch mal was dir die funktioni getInputStream zurück gibt ...


----------



## Guest (21. Nov 2007)

Warum nicht gleich CORBA, statt das Rad neu zu erfinden?


----------



## joergh (22. Nov 2007)

Die fragen hören leider nicht auf...


```
receivedData= "";
				System.out.println("vor empfangen");
				BufferedReader in = new BufferedReader(new InputStreamReader(myClient.getInputStream())); 
				try{
					System.out.println("in.readLine()"+in.readLine());
				}
				catch(Exception e){
					System.out.println(e);
				}
				while ((receivedData = in.readLine()) != null) {
					System.out.println("receivedData: "+receivedData);
				}
```
So versuche ich von vc++ gesendete Daten zu empfangen. Sobald in.readLine() aufgerufen wird, stürzt das Programm ab. Einige Versuche zeigen, dass etwas empfangen wurde (wenn "in" selbst ausgegeben wird), nach in.readLine() passiert allerdings überhaupt nichts mehr, es wird nicht einmal eine Exception geworfen. Woran liegts? Gibts ne empfangsalternative? Würde schon gerne auch das empfangen,w as geschickt wird.

Danke!


----------



## HoaX (22. Nov 2007)

sicher dass er aus dem readLine-Aufruf zurück gekomment ist? sicher dass die gegenseite einen zeilenumbruch gesendet hat?


----------



## joergh (22. Nov 2007)

HoaX hat gesagt.:
			
		

> sicher dass er aus dem readLine-Aufruf zurück gekomment ist? sicher dass die gegenseite einen zeilenumbruch gesendet hat?


Ja, das ist mir auch gerade aufgefallen. Hab ein "\n" an der String gehängt, schon ist es da.

Nochmal herzlichen Dank für alles - das nächste problem kommt bestimmt ;-)


----------

