Comunicação Socket Java(server)&lt-C(client) [RESOLVIDO]

3 respostas
brlima

Pessoal,

Estou tentando fazer uma implementação de um servidor socket em java para escutar um client em feito em C.

O problema está em tentar ler o conteudo enviado pelo client (que está em C).

O servidor está OK. o Client tb. Se o client é feito em java, a comunicação ocorre perfeitamente. Mas em C não esta ocorrendo isso.

Aparentemente, o server em java consegue reconhecer o envio do pacote pelo client em C, mas nao consegue recuperar o conteudo do mesmo pelo método readUTF.

Segue o codigo em java do server:

// Identificacao do servidor 
		InetAddress iServer = null;
		InetAddress iClient = null;

		// Exibindo mensagem de inicializacao do servidor
		System.out.println("Socket Server RUNNING");

		// Criando o Socket Server
		ServerSocket serverSocket = new ServerSocket(1313, 0, iServer
				.getByName("k"));

		// Pegando dados do Servidor
		int iTimeOut = serverSocket.getSoTimeout();
		int iLocalPort = serverSocket.getLocalPort();
		InetAddress inetAddress = serverSocket.getInetAddress();

		System.out.println("Address: " + inetAddress.toString());
		System.out.println("Port: " + iLocalPort);
		System.out.println("TimeOut: " + iTimeOut);

		int iLoop = 0;
		System.out.println("Entrando no LOOP\n");
		while (iLoop == 0) {
			// Aguardando conexoes
			Socket socket = serverSocket.accept();

			String ss = socket.toString();
			System.out.println("Client Socket Info: " + ss);

			iClient = socket.getInetAddress();
			System.out.println("Client: " + iClient.toString());

			// Criar um canal para receber dados
			DataInputStream in = new DataInputStream(socket.getInputStream());

			// Criar um canal para enviar dados
			DataOutputStream ou = new DataOutputStream(socket.getOutputStream());

			System.out.println("Recebendo dados do CLIENT\n ");
			// Aguarda Recebimento dos dados
			String s = in.readUTF();

			System.out.println("Received from Client: " + s);

			// Identificando os SERVICOS

			// Enviando Dados
			ou.writeUTF("Respondendo do Servidor para o Client...\0\n");

			// Fechando canais de comunicacao
			in.close();
			ou.close();

			// Fechando o socket q esta atendendo o cliente
			socket.close();
			if (s.equals("sai")) {
				break;
			}
		}

		// Fechando o Servidor
		serverSocket.close();

		System.out.println("Socket Server DOWN");

3 Respostas

T

Você precisa implementar algo semelhante ao DataInputStream/DataOutputStream em C. Para tanto, é necessário
saber como é o formato de dados esperado por essas Streams.

Por exemplo:
No caso de readUTF/writeUTF, é necessário pôr 2 bytes que indicam o comprimento da String (já transformada para bytes), e codificar a String em UTF modificada (ou seja, se houver um zero binário dentro da string, não é codificada como um byte zero, mas de uma outra forma que deve ser vista no fonte dessas classes.

String s = "Gisele Bündchen";
ou.writeUTF (s);

deve gerar os seguintes bytes, que o programa C deve interpretar:

00 10 47 69 73 65 6C 65 20 42 C3 BC 6E 64 63 68 65 6E
----- G  i  s  e  l  e  SP B [ ü ]  n  d  c  h  e  n

Note que a letra ü que usa apenas 1 byte em codificação ISO-8859-1, usa 2 em UTF-8.
Outra coisa é que o comprimento ficou em 16 bytes (isso dá 0010 em hexadecimal, ou seja, os 2 primeiros bytes ficam 00 10).

brlima

Valeu Thingol!

Não cheguei nesse ponto, mas ajudou a entender que DataStream não era o que eu precisava…

Usei o BufferedStream, e funcionou legal…

Tks.!

G

Pessoal,

Me desculpe por ressuscitar esse tópico mas estou com um problema semelhante mas com PHP e Java.

Tenho um servidor de socket em PHP e um cliente em JAVA. Com o cliente (JAVA) consigo me conectar tranquilamente ao servidor (PHP), o servidor recebe os dados enviados pelo cliente, mas, o cliente não consegue receber os dados enviados pelo servidor.

Será que o problema é mesmo mencionado nesse tópico? Será que vocês podem me ajudar a resolver?

Desde já agradeço a atenção de vocês.

Atenciosamente,

GENNF

Criado 16 de janeiro de 2007
Ultima resposta 17 de mai. de 2011
Respostas 3
Participantes 3