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.
Cara, tem como vc postar um trechinho reduzido ao maximo de como vc esta escrevendo/lendo esses dados?
dsiviotti
Servidor java:
publicclassSocketServer{staticintc=0;publicstaticvoidmain(String[]args){ServerSockets=null;try{s=newServerSocket(5432);}catch(IOExceptione){e.printStackTrace();}while(true){try{Sockets1=s.accept();c++;System.out.println("Conexão estabelecida: "+c);OutputStreams1out=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(s1out);dos.writeUTF("Mensagem do Servidor Java!");dos.close();s1.close();}catch(IOExceptione1){e1.printStackTrace();}}}}
Cliente Java:
publicclassSocketClient{publicstaticvoidmain(String[]args){try{System.out.println("Abrindo Socket...");Sockets1=newSocket("127.0.0.1",5432);InputStreamis=s1.getInputStream();DataInputStreamdis=newDataInputStream(is);System.out.println("Servidor: "+dis.readUTF());dis.close();s1.close();System.out.println("Fechando Socket");}catch(ConnectExceptionconnExc){System.out.println("Não foi possível conectar o servidor");}catch(IOExceptione){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:
procedureTForm1.Button6Click(Sender:TObject);varStream:TWinSocketStream;Buffer:array[0..14]ofChar;s:string;beginwhilecs.Socket.ConnecteddobegintryStream:=TWinSocketStream.Create(cs.Socket,60000);tryFillChar(buffer,15,' '); { initialize the buffer }ifStream.WaitForData(3000)thenbeginifStream.Read(buffer,15)=0thencs.Socket.Close;s:=buffer;lbx.items.add(s);endelsecs.Socket.Close;finallyStream.Free;end;exceptShowmessage('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
ralobao
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.
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?