Comunicação com Socket e ServerSocket

Boa noite,

Estou estudando comunicação via sockets, e surgiu uma dúvida.

Quando envio uma mensagem por um OutPuStream, eu tenho que fechá-lo para que o outro lado consiga fazer a leitura do mesmo?

Estou tendo dificuldade em manter os sockets abertos, para enviar e receber multiplas mensagens.

Enquanto eles ficam abertos os fluxos de leitura não conseguem ler.

Espero ter sido claro.

Não precisa fecha-lo. Que tipo de Outputstream você está usando?

O único cuidado que vc tem que tomar é que o número de “writes” de um dos lados da conexão pode não ter absolutamente nada a ver com o número de “reads” que precisam ser feitos do outro lado.

Tentei com PrintWriter e também com BufferedWriter.

Mesmo acionando o flush(), a mensagem não é enviada, ou então talvez ela seja enviada, porem o cliente retorna falso, quando eu aciono o metodo .ready() do InputStreamReader tentando ler a mensagem.
A tansferência de mensagem só ocorre quando chamo o metodo close() no escritor , porém isto faz com que a conexão com o ServerSocket seja fechada.

Consegui resolver, o meu erro era que eu estava usando print para enviar a mensagem e ReadLine() para ler.

Entretanto o método ReadLine() define uma “linha lida” somente quando encontra um caractere especial de quebra de linha, ou seja um detalhe bobo que quase me frustrou :smiley:

Escrevi com println() (que coloca a quebra no final \n) e problema, resolvido.

Aproveitando o tópico aberto:

Para conectar vários clientes na minha classe servidora, eu tenho que ir incrementando o numero da porta?
Consigo passar um objeto serializado pelo OutputStream??
O que é melhor em termos de performance, utilizar sockets ou usar RMI?

Obrigado pela atenção.

Att. Paulo

Você pode utilizar a mesma porta, mas tem que criar um socket separado para cada accept() que você receber.

Faz isso utilizando o ObjectOutputStream.

Para desempenho, o melhor é evitar intermediários, ou seja, o socket é o modo mais rápido de enviar dados.

[OFF] Alguém acerta a hora do GUJ, está com mais de 2 horas de atraso [/OFF]

Sockets não são arquivos. Não use PrintWriter para escrever em Sockets.
Procure entender direito o que é um protocolo, como é organizado, e como transmitir dados de forma binária. Vai te evitar muita dor de cabeça, ao mesmo tempo que vai melhorar consideravelmente a qualidade da sua comunicação socket.

Outra grande fonte de dores de cabeça é o ObjectOutputStream/ObjectInputStream. Além de consumirem muita banda, eles são fontes fáceis de memory leaks.

ViniGodoy, você vem e joga um monte de coisas no ar rsrs

Esclarece aí por favor:

O que usar em vez de ObjectOutputStream? Porque eles são fontes fáceis de memory leaks?
Devo usar o que para trafegar os dados pelo socket? BufferedWriter?

O ObjectInputStream não deixa claro qual é o formato da serialização do objeto. Geralmente, ele serializa coisas demais, que vão deixar seu protocolo muito gorduroso. Eles também costumam a ser pouco eficientes.

Eu usaria o DataInputStream para escrever no Socket, ou então, a classe ByteBuffer e o pacote java.nio.
Agora, é importante entender como o TCP/IP funciona. Você nunca sabe quantos dados deve ler “do lado de lá”. Isso, quem deve indicar é o seu protocolo.