Problema em socket

14 respostas
Wolf_X

estou enfrentadno um probleminha, preciso me comunicar com um servidor via socket, tudo está indo completamente normal mas acontece um porem, o servidor quando me envia algumas respostas nao fecha a linha (no caso o \r\n) por isso qdo efetuo o readline() ele simplesmente nao retorna a ultima linha, como eu corrijo esse problema???

obrigado :smiley:

14 Respostas

ziegfried

readUTF()?

Wolf_X

eu estou usando BufferedReader, esse readUTF soh funciona com ObjectInputStream neh? o problema eh q o servidor trabalha apenas com texto e nao consegui fazer funcionar com o ObjectInputStream , alguma ideia gente???

Abdon

Leia os bytes do inputstream do socket com o metodo read e depois use o array de bytes no contrutor da classe String.

Wolf_X

usando o bufferedreader ou o ObjectInputStream?

tem como se me da um exemplozinho basico :oops:

obrigado :smiley:

Abdon
byte[] buffer = new byte[5000]; //tamanho de acordo com sua necessidade
ObjectInputStream a; //imagine que já esta instanciado pelo seu socket
a.read(buffer);
String lixo = new String(buffer);
Abdon

melhor dizendo o meu ‘a’ não é um ObjectInputStream e sim um

InputStream a = socket.getInputStream();
KWill

Wolf_X:
estou enfrentadno um probleminha, preciso me comunicar com um servidor via socket, tudo está indo completamente normal mas acontece um porem, o servidor quando me envia algumas respostas nao fecha a linha (no caso o \r\n) por isso qdo efetuo o readline() ele simplesmente nao retorna a ultima linha, como eu corrijo esse problema???

obrigado :D

Até onde sei, o método readLine() do BufferedReader vai bloquear até ele detectar um “\r\n” ou “\r” ou “\n” no Reader que ele encapsula.

Trecho do javadoc J2SE 1.5:

Então, se o seu servidor não enviar “\r” ou “\n” ou “\r\n” entre as mensagens, seu código vai ficar bloqueado lá no readLine() mesmo…

Inté.

Wolf_X

ola KWill , o problema eh q configurei meu socket para esperar apenas 2segundos , entao ele simplesmente anula a informação , entende , Abdon muito obrigado cara !!! vou tentar faze desse jeito ai , brigadao mesmo, soh uma pergunta , no seu exemplo eu terei q conhecer o tamanho da mensagem antes? ou ele finaliza normalmente ?
se eu tiver q conhecer o tamanho antes , o server me envia no 1º parametro o tamanho do corpo entao seria certo fazer um readline para pegar o parametro e depois o read do resto da msg?
obrigado

Abdon

Não existe a necessidade de usar um readLine para pegar a mensagem. vc pode colocar o tamanho da mensagem nos primeiros bytes do array, depois fazer um pooling para pegar todos os bytes. Assim vc so usaria o método read da classe InputStream

KWill

Wolf_X:
ola KWill , o problema eh q configurei meu socket para esperar apenas 2segundos , entao ele simplesmente anula a informação , entende , Abdon muito obrigado cara !!! vou tentar faze desse jeito ai , brigadao mesmo, soh uma pergunta , no seu exemplo eu terei q conhecer o tamanho da mensagem antes? ou ele finaliza normalmente ?
se eu tiver q conhecer o tamanho antes , o server me envia no 1º parametro o tamanho do corpo entao seria certo fazer um readline para pegar o parametro e depois o read do resto da msg?
obrigado

Acho que configurar o Socket para esperar apenas 2 segundos para obter dados não é uma boa idéia no seu caso. E cuidado, porque no método Socket.setSoTimeout(int timeout), esse timeout está em milissegundos, não em segundos.

Raramente mexo nesse Socket.setSoTimeout(int timeout).
Só uso Socket.connect(SocketAddress endpoint, int timeout), pra ele não entrar em loop infinito tentando conectar e ServerSocket.setSoTimeout(int timeout) para o ServerSocket não bloquear para sempre tentando ouvir conexão.

Não sei o porquê desse seu Socket.setSoTimeout(int timeout). TCP é seguro o sufienciente para garantir que seus dados chegarão ao outro lado se a conexão estiver estabelecida.

Inté.

Wolf_X

eh meio complicado, acontece q eu fiz um arraylist de sockets e fico indo de um em um na esperança de algum dado novo, entende? eu nao quis fazer uma thread pra cada pois nao tinha nem noçao de qts precisaria , vcs axam q fiz errado?

KWill

Nesse tópico tem um exemplo de como fazer aplicações multi socket sem criar várias threads. Mas você vai ter que migrar pra NIO.

http://www.guj.com.br/posts/list/53057.java

Inté.

Wolf_X

galera, to com um probleminha (MAIS UM NEH :D), eu fiz de acordo com o exemplo do Abdon mas acontece q eu nao sei o tamanho da entrada, isso ta me gerando um probleminha pq qdo a mensagem acaba o resto da mensagem recebe quadrados para preencher o tamanho q eu estipulei, eu pensei em dar um substring e retirar a parte dos quadrados mas nao consigo localiza-los, alguem sabe como poderia fazer isso? (ou estou fazendo uma gambiarra muito feia?)
obrigado.

G

Você pode verificar inicialmente quantos byte estão disponíveis no stream de entrada. Assim:

InputStream in = socket.getInputStream();

int bytesDisponiveis = in.avaiable();
bytes[] dados = bytes[bytesDisponiveis];

in.read(dados);

Criado 3 de abril de 2007
Ultima resposta 13 de set. de 2007
Respostas 14
Participantes 5