Sockets Java-Delphi-Java

6 respostas
dsiviotti

Pessoal,

Passei o dia me matando :x pra tentar fazer um programa java enviar uma simples string para um programa delphi e vice-versa. Já li quase tudo sobre isso aqui no GUJ e agora ao final do dia o programa em delphi pegou alguns caracteres perdidos usando um socketStream que achei no help do Delphi. O programa em java apenas registra que houve conexão, mas também náo recebe nada. Alguém teria exemplo(s) dessa cominicaçao entre soquetes dessas duas liguagens? Que classes devo usar para que a comunicação fique compatível?

PS o problema é realmente de compatibilidae pois o Server e oCliente, quando na mesma linguagem, se falam normalmente.

6 Respostas

cv1

Cara, tem como vc postar um trechinho reduzido ao maximo de como vc esta escrevendo/lendo esses dados?

dsiviotti

Servidor java:

public class SocketServer {
	
	static int c = 0;

	public static void main(String[] args) {
		ServerSocket s = null;
		
		try {
			s = new ServerSocket(5432);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		while (true) {
			try {
				Socket s1 = s.accept();
				c++;
				System.out.println("Conexão estabelecida: " + c);
				OutputStream s1out = s1.getOutputStream();
				DataOutputStream dos = new DataOutputStream(s1out);
				dos.writeUTF("Mensagem do Servidor Java!");
				dos.close();
				s1.close();	
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}	
	}
}

Cliente Java:

public class SocketClient {
	public static void main(String[] args) {
		try {
			System.out.println("Abrindo Socket...");
			Socket s1 = new Socket("127.0.0.1", 5432);
			InputStream is = s1.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			System.out.println("Servidor: " + dis.readUTF());
			dis.close();
			s1.close();	
			System.out.println("Fechando Socket");										 
		} catch (ConnectException connExc) {
			System.out.println("Não foi possível conectar o servidor");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Estes dois se falam normalmente. Mas quando tem que enviar algo para o ClientSocket do Delphi não dá certo. A não ser que eu deva usar outro método além de writeUTF().

dsiviotti

Socket Client em Delphi tá assim:

procedure TForm1.Button6Click(Sender: TObject);
var
  Stream : TWinSocketStream;
  Buffer : array[0 .. 14] of Char;
  s: string;
begin
  while cs.Socket.Connected do
  begin
    try
      Stream := TWinSocketStream.Create(cs.Socket, 60000);
      try
        FillChar(buffer, 15, ' '); { initialize the buffer }
        if Stream.WaitForData(3000) then
        begin
          if Stream.Read(buffer, 15 ) = 0 then
            cs.Socket.Close;
          s:= buffer;
          lbx.items.add(s);
        end
        else
          cs.Socket.Close;
      finally
        Stream.Free;
      end;
    except
      Showmessage('erro');
    end;
  end;

cs é um ClientSocket (componente Visual) já criado. O estranho é dependendo do tamanho da variável buffer o resultado da leitura é diferente.
Este código faz a leitura de “ervidor Java”, falta o resto da mensagem.

R

pode ser o tamanho do buffer ?

dsiviotti

Ok. O tamanho realmente tá meio estranho, mas já resolvi com “cs.Socket.ReceiveLength” que retorna o tamanho exato.
O problema do código em Delphi é que os 2 primeiros caracteres são de controle. Após ler o segundo ele não mostrava mais nada. Agora eu leio a partir do terceiro. Além disso tinha que trocar o ClientType de ctNonBlocking para ctBlocking.
No código em java eu fiz um quebra galho trocando o método readUTF() por readLine(). O readUTF dava erro de “Unknown Source”.
Agora já tá enviando do Java p/ o Delphi e vice versa. :smiley:
Se alguém tiver uma solução diferente dessa bacalhoada eu agradeço.

cv1

Seguinte, Douglas: se eu me lembro bem (e a possibilidade de isso acontecer eh remota), o Delphi usa os dois primeiros bytes de qualquer string para passar o tamanho dela (ao contrario do Java, onde os char[]s e Strings funcionam de um jeito totalmente diferente). Entao, writeUTF e readUTF provavelmente nao vai funcionar legal…

Voce esta querendo usar um protocolo binario ou text-only?

Criado 12 de fevereiro de 2004
Ultima resposta 13 de fev. de 2004
Respostas 6
Participantes 3