# Socket Kommunikation C / Java



## iroc (8. Apr 2015)

Hallo,
ich habe einen Hänger und bräuchte einen Denkanstoß bei folgenden relativ simplen Problem:

Mein Client schickt zum Server einen String und erhält eine Antwort in dem der Server den String mit einem anderen Vergleicht.
Das Senden und Empfangen funktioniert. Was nicht funktioniert ist der Vergleich.
Ich dachte das es simple funktioniert, entweder durch:
if (empfangener String == "Vergleich") ...
oder
if (empfangener String.equals("Vergleich") ....

doch leider ist dem nicht so, oder ich übersehen etwas.

Code vom Server sieht wie folgt aus, entsprechende Stelle beginnt bei Zeile 58 :


```
package jserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;

public class JServer implements Runnable {
	int backlog = 10;
	int port = 1958;
	//World world = new World();
	Handler handler;
	Logger logger;

	JServer() {
		try {
			handler = new FileHandler("logs.xml");
			logger = Logger.getGlobal();
			logger.addHandler(handler);

		} catch (SecurityException | IOException e) {
			e.printStackTrace();
		}

		Thread t = new Thread(this, "Server");
		t.start();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new JServer();

	}

	@Override
	public void run() {
		try {
			ServerSocket socket = new ServerSocket(port, backlog);
			for (;;) {
				System.out.println("Waiting for next connection... ");
				Socket sockConnected = socket.accept();
				System.out.println("Connected with " + sockConnected);
				logger.info("Connected with " + sockConnected);
				PrintStream ps = new PrintStream(
						sockConnected.getOutputStream());

				InputStream isr = sockConnected.getInputStream();

				String line = getLine(isr);

				if (line == "Hallo Welt"){
					ps.println("richtig");
					}
					else
						ps.println("flasch");				
				
				System.out.println(line);
				logger.info(line);					
				
				isr.close();
				ps.close();
				System.out.println("closing socket");
				sockConnected.close();
			}

		} catch (IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}

	}

	private String getLine(InputStream isr) {
		byte[] b = new byte[1];
		String sb = "";
		try {
			while (isr.read(b) >= 0) {
				char c = (char) b[0];
				sb += (new Character(c)).toString();
				if (c == '\n') {
					return sb;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	private void printStatusPage(PrintStream ps) {
		//ps.println(world.status());

	}

}
```


Zur Vollständigkeit noch der C-Code vom Client, Übergabestelle ist am Ende:


```
// Client.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "1958"

static int verbose = 1;
static char answer[500];


int terminate( char* text ) {
	if( verbose ) printf(text);
	WSACleanup();
	system( "pause" );
	return 1;
}


int sendMessage(char *sendbuf ) {
	WSADATA wsaData;
	SOCKET ConnectSocket = INVALID_SOCKET;
	struct addrinfo *result = NULL,
		*ptr = NULL,
		hints;
	int iResult;
	int recvbuflen = DEFAULT_BUFLEN;
	char recvbuf[DEFAULT_BUFLEN];

	// Initialize Winsock
	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if (iResult != 0) {
		printf("WSAStartup failed with error: %d\n", iResult);
		return 1;
	}

	ZeroMemory( &hints, sizeof(hints) );
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;

	// Resolve the server address and port
	iResult = getaddrinfo("localhost", DEFAULT_PORT, &hints, &result);
	if ( iResult != 0 ) {
		printf("getaddrinfo failed with error: %d\n", iResult);
		WSACleanup();
		return 1;
	}

	// Attempt to connect to an address until one succeeds
	for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

		// Create a SOCKET for connecting to server
		ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
			ptr->ai_protocol);
		if (ConnectSocket == INVALID_SOCKET) {
			printf("socket failed with error: %ld\n", WSAGetLastError());
			WSACleanup();
			return 1;
		}

		// Connect to server.
		iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
		if (iResult == SOCKET_ERROR) {
			closesocket(ConnectSocket);
			ConnectSocket = INVALID_SOCKET;
			continue;
		}
		if( verbose ) printf("socket connected\n");
		break;
	}

	freeaddrinfo(result);

	if (ConnectSocket == INVALID_SOCKET) {
		terminate("Unable to connect to server!\n");
	}

	// Send an initial buffer
	iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
	if (iResult == SOCKET_ERROR) {
		printf("send failed with error: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}

	if( verbose ) printf("Bytes Sent: %ld\n", iResult);

	// shutdown the connection since no more data will be sent
	iResult = shutdown(ConnectSocket, SD_SEND);
	if (iResult == SOCKET_ERROR) {
		printf("shutdown failed with error: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}

	answer[0] = '\0';
	// Receive until the peer closes the connection
	do {

		iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
		if ( iResult > 0 ) {
			recvbuf[iResult] = '\0';
			if( verbose ) printf("Bytes received: %d %s\n", iResult, recvbuf);
			strcat_s( answer, recvbuf );
			//printf(">>>%s<<<\n", answer );
		} else if ( iResult == 0 ) {
			if( verbose ) printf("Connection closed\n");
		} else
			printf("recv failed with error: %d\n", WSAGetLastError());

	} while( iResult > 0 );

	// cleanup
	closesocket(ConnectSocket);
	WSACleanup();

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	printf("starting ... \n");
	sendMessage("Hallo Welt\n");
	system("pause");
	return 0;
}
```

Danke für Hilfestellungen und Anmerkungen


----------



## Gucky (8. Apr 2015)

Ich gehe mal davon aus, dass du den Code für einen Zwinkersmiley im Code hattest und das Forum deshalb *<img src="images/smilies/wink.png" border="0" alt="" title="Wink" class="inlineimg" />* daraus gemacht hat. Sonst wäre es ein Wunder, dass der Code überhaupt anstandslos startet.

Strings mit == zu vergleichen geht in Java nicht.
Lass dir den String doch mal ausgeben und vergleiche dies mit der Länge des Strings. Ich kann mir gut vorstellen, dass das Stringende Zeichen aus C noch darin enthalten ist. Das müsstest du noch entfernen.


----------



## Tobse (10. Apr 2015)

Wie Gucky schon sagte: In Java musst du Strings mit .equals vergleichen. Aber selbst wenn du das tätest: Du schickst nach dem HelloWorld noch ein *\n* mit. In Java prüfst du das aber nicht:


```
sendMessage("Hallo Welt\n");
```


```
if (line == "Hallo Welt")
```

Tausche also das == gegen .equals. Zusätzlich musst du in deiner Server-Methode getLine noch diese zwei Anweisungen vertauschen, damit das \n (was ja das Ende der Nachricht markiert) nicht mit zurückgegeben wird:


```
sb += (new Character(c)).toString();
if (c == '\n') {
	return sb;
}
```


----------

