Estou tentando enviar uma string de um cliente Delphi usando sockets TCP para servidor Java porem me ocorre o seguinte erro:
java.io.UTFDataFormatException: malformed input around byte 8
No Java eu utilizo DataInputStream para receber a informação como segue abaixo:
in = new DataInputStream(socket.getInputStream()); String s = in.readUTF();
Você teria de modificar ligeiramente seu programa Delphi para enviar os dados no formato que o Java está esperando. Quando você usa DataInputStream, se você quer ler uma String, os bytes devem estar no layout que DataOutputStream geraria.
Veja a documentação de DataOutputStream para saber exatamente que formato DataInputStream está esperando, quando você usa “readUTF”.
First, two bytes are written to the output stream as if by the writeShort method giving the number of bytes to follow. This value is the number of bytes actually written out, not the length of the string. Following the length, each character of the string is output, in sequence, using the modified UTF-8 encoding for the character. If no exception is thrown, the counter written is incremented by the total number of bytes written to the output stream. This will be at least two plus the length of str, and at most two plus thrice the length of str.
Daqui a pouco vou dar um exemplo de que o Delphi deveria fazer para você receber a string “Gisele Bündchen”.
T
thingol
DataInputStream espera a seguinte seqüência de bytes quando você vai ler com readUTF:
A string “Gisele Bündchen” tem 15 caracteres, mas é representada, em UTF-8, como “47 69 73 65 6C 65 20 42 C3 BC 6E 64 63 68 65 6E”, ou seja, 16 bytes. Uma particularidade é que o caracter “ü” é representado em 2 bytes (C3 BC), porque você está usando o UTF-8.
Você viu, então, que DataInputStream espera que você mande o comprimento em 2 bytes (Big-Endian, mesmo no Windows - isto quer dizer que você vai ter de inverter alguma coisa no Delphi), e depois o conteúdo da string. É necessário converter sua string do Delphi para UTF-8, é necessário ver se o Delphi tem uma função dessas de conversão, ou se você vai ter de usar uma API do Windows (que usa Code Page 1252 - mais conhecida no Windows como “ANSI”, ou a codificação ISO-8859-1, que é quase igual à 1252, exceto por 2 ou 3 caracteres.)