Dúvida com Socket

8 respostas
kina

Estou aprendendo a usar Socket e tenho uma dúvida.
Estou fazendo um programa tipo cliente servidor.
Quando eu faço a conexão (serverSocket.accept()) eu recebo um Socket.
Na classe cliente eu mando um objeto, e o meu server recebe, tudo certo até então.
O código está abaixo.
Servidor:

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor extends Thread{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Servidor();
	}
	public Servidor()
	{
		ServerSocket server;
		try {
			server = new ServerSocket(1234);
				Socket s = server.accept();
				while(true)
				{
					InputStream ss = s.getInputStream();
					ObjectInputStream o = new ObjectInputStream(ss);
					System.out.println(o.readObject());
					
				}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Cliente

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cliente {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Socket s = new Socket("127.0.0.1", 1234);

			ObjectOutputStream o = new ObjectOutputStream(s.getOutputStream());
			o.writeObject("hahahaha");
			o.flush();
			o.writeObject("233222");
			o.flush();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

O problema é que eu não sei se existe algum método de deixar a Thread do Servidor em “wait”, esperando que o cliente mande algum objeto.
Qual seria o jeito mais efetivo, ao invez de ficar usando Thread.sleep() ou um loop infinito que fica dando erro direto?

Obrigado

8 Respostas

saoj

Esses sockets aí são blocking sockets, isto é, quando vc faz um:

String msg = in.readLine();

Ele bloqueia e fica esperando uma mensagem…

kina

Mas o problema é que eu não vou receber uma String, e sim um objeto…

kina
Lelis_el_Quatilas

Não entendi muito bem a sua dúvida… Vc quer um comando que paralise o fluxo do servidor até receber um objeto? Isso considerando que a conexão já foi feita? Um comando como o readline para strings?

kina

Lelis el Quatilas:
Não entendi muito bem a sua dúvida… Vc quer um comando que paralise o fluxo do servidor até receber um objeto? Isso considerando que a conexão já foi feita? Um comando como o readline para strings?
Supondo que eu utilize o código acima, e, ao invez de enviar um Objeto String eu mande um outro Objeto qualquer (por exemplo uma classe Pessoa).
Eu gostaria de saber se existe alguma função parecida com o:

String msg = in.readLine();

Ou seja, que paralize o meu servidor, esperando que eu receba o meu Objeto sem ter um “gasto” da máquina servidora.

Lelis_el_Quatilas

Tentei algumas coisas aqui, mas sem sucesso. Vc tem que passar um objeto, não poderia ser uma string não? Certa vez eu precisei passar algo mais que uma string. Coloquei todas as informações em uma string mesmo e as separei com @, do lado do servidor eu faço um parser e monto os objetos. Talvez não tenha ficado elegante, mas funcionou.

Se encontrar a solução, por favor poste aqui, fiquei curioso!

saoj

Mesmo esquema para um ObjectInputStream:

Object obj = in.readObject();

Isso bloqueia e vc deve colocar isso dentro de um thread.

Um client = Um Thread

Lelis_el_Quatilas

Então acho que o problema já está resolvido… O que vc deve fazer é sempre que um cliente se conectar ao servidor, criar uma thread que “cuida” daquele cliente… e tira os

InputStream ss = s.getInputStream();
 					ObjectInputStream o = new ObjectInputStream(ss);

de dentro do laço infinito, caso cada cliente tenha que enviar mais de um objeto - como é o caso.
Espero que tenha resolvido.

Inté,

Criado 7 de julho de 2005
Ultima resposta 7 de jul. de 2005
Respostas 8
Participantes 3