Mano é um seguinte, quando eu mexo com socket eu utilizo uns metodos diferentes para receber e enviar mensagens, nao vou dizer que o seu codigo esta errado pois nao testei. Mais vai la minha posição:
Quando vc da um serversocket.accept() esse metodo fica em estado de espera ate que alguem tente se conectar utilizando a sua maquina na porta que vc abriu. Quando alguem tenta conectar esse metodo retorna o objeto Socket da conexao. Ate ae blza. Agora para enviar e receber mensagens eu crio um BufferedReader para a leitura. Essa classe possui o metodo readLine(), esse metodo fica em espera tbm ate que a outra ponta envie uma mensagem, quando ela envia, esse metodo começa a retornar linha a linha, caso ela nao envia, ele continua em espera enquanto a conexao estiver aberta. Tanto no lado cliente quanto no servidor vc tem que deixar ele totalmetne em escuta, esperando por mensagens. Vc pode enviar quantas mensagens quizer mesmo estando em estado de espera, pois pra isso que serve as thread, porem para vc conseguir receber, vc tem que esta sempre esperando mensagens, e nao simplesmente da um read quando vc achar q vai vim mensagem. Caso vc nao tenha entendido eu postarei um codigo padrao de cliente e servidor que costumo usar.
receber:
BufferedReader br = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
String t = "";
while ((t = br.readLine()) != null) {
System.out.println("Recebido: "+t);
}
Para receber vc tem que por isso no run da thread, ele vai ficar em espera e retornar uma linha cada vez que receber.
e pra enviar vc pode usar um PrintWriter e da um println depois um flush().
Ah outra coisa, o ideal é que tanto a classe cliente quanto servidor extenda Thread, pois se nao sua aplicacao vai ficar travada esperando mensagem, e vc nao podera fazer mais nada alem de esperar.
package tce.am.gov.br.cliente;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Cliente {
private Socket conexao ;
private String host ;
private ObjectOutputStream enviar ;
private ObjectInputStream receber ;
public Cliente(String host) {
this.host = host ;
}
public void run() {
try {
iniciarConexao();
fluxoMensagem();
receberMensagem();
}catch (EOFException e) {
System.out.println("Conexao finalizada");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void iniciarConexao() throws UnknownHostException, IOException {
System.out.println("Cliente solicitando conexão.");
conexao = new Socket( InetAddress.getByName(host) , 12345 );
System.out.println(" Conexão estabelecida com : " + conexao.getInetAddress().getHostName() );
}
private void fluxoMensagem() throws IOException {
enviar = new ObjectOutputStream( conexao.getOutputStream() );
enviar.flush();
receber = new ObjectInputStream( conexao.getInputStream() );
}
public void receberMensagem() throws IOException {
System.out.println("Agaurdando Mensagem do Servidor...");
enviarMensagem("Obirgado !");
String mensagem = "";
try {
do {
mensagem = ( String ) receber.readObject() ;
System.out.println("Servidor >> " + mensagem);
System.out.println("Esta dentro do looping do cliente");
} while ( !mensagem.equals("") );
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void enviarMensagem( String mensagem ) throws IOException {
enviar.writeObject(mensagem);
enviar.flush();
}
private void fecharConexao() throws IOException {
enviar.close();
receber.close();
conexao.close();
}
public static void main(String[] args) {
Cliente cliente = new Cliente("127.0.0.1");
cliente.run();
try {
cliente.enviarMensagem("teste cliente 1");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Servidor
package tce.am.gov.br.servidor;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Servidor {
private ServerSocket servidor ;
private Socket conexao ;
private ObjectOutputStream enviar ;
private ObjectInputStream receber ;
public void iniciarServidor() {
try {
servidor = new ServerSocket(12345);
} catch (IOException e) {
System.out.println("Conexão não estabelecida com o cliente.");
}
try {
while ( true ) {
aguardarConexao();
fluxoMensagem();
receberMensagem();
}
} catch (IOException e) {
System.out.println("Erro na ");
}
}
private void aguardarConexao() throws IOException {
System.out.println("Servidor aguardando conexão...\n");
conexao = servidor.accept() ;
System.out.println(" Conexão estabelecida com : " + conexao.getInetAddress().getHostName() );
}
private void fluxoMensagem() throws IOException {
enviar = new ObjectOutputStream( conexao.getOutputStream() );
enviar.flush();
receber = new ObjectInputStream( conexao.getInputStream() );
}
private void fecharConexao() throws IOException {
enviar.close();
receber.close();
conexao.close();
}
private void enviarMensagem( String mensagem ) throws IOException {
enviar.writeObject(mensagem);
enviar.flush();
}
private void receberMensagem() throws IOException {
System.out.println("Agaurdando Mensagem do CLiente...");
enviarMensagem("Seja Bem Vindo !");
String mensagem = "";
try {
do {
mensagem = ( String ) receber.readObject() ;
System.out.println("Cliente >> " + mensagem);
System.out.println("Esta dentro do looping do servidor");
} while ( !mensagem.equals("") );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Servidor server = new Servidor();
server.iniciarServidor();
try {
server.enviarMensagem("Olá !");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Gente depos que o clinte realiza conexao com o servidor não ocorre a troca de mensagem !!!
Alguem pude me ajudar a identificar onde esta o bug !?!?!?
Alguem pode ajudar…é so a troca da mensagem ke nao esta ocorrendo !!!
Só basta eu colocar um extends Thread !!???
Ainda não funcionou !!!
O cliente e servidor fica se ouvindo todo momento .
receberMensagem() fica aguardando nos 2…