Envio de string via Socket

4 respostas
L

Possuo uma classe que extende Thread, no construtor dela inicio o meu socket minha entrada e minha saída de dados:

private Socket connection = null;

private BufferedReader entrada=null;

private PrintStream saida = null;

SocketEvents() {

this.connection = new Socket(host, port);
          this.saida = new PrintStream(connection.getOutputStream());
          this.entrada = new BufferedReader(new InputStreamReader(connection.getInputStream()));

}

Em seguida executo o meu método Run():

public void run() {

Interface.SetAreaTxt("Conectando e iniciando login em "+host+" on port "+port);
                  
        String msg = "LOGIN:USUARIO:SENHA";
       
        saida.println(msg);
               
        while(connection.isConnected()){
       
                 Interface.SetAreaTxt(entrada.readLine());

                 Thread.sleep(100);
         }

Até aqui funciona perfeitamente eu efetuo o login com os dados que enviei, e fico recebendo as informações do servidor.
O problema é que em outra função pertecente a esta classe eu tento enviar outro tipo de informação mas não envia, apesar de não gerar erro nenhum:

public void GetInfo(String Info) throws IOException {

saida.println(Info);

}

Alguém tem idéia do que está acontecendo?
Obrigado.

4 Respostas

marcosharbs

onde que vc ta criando o servidor socket?
e quando que seu cliente esta se conectando nele?
abaixo segue o codigo de uma classe java que fiz implementando socket, um server para um jogo da velha:

package Servidor;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;

import Comunicacao.Jogada;
import Comunicacao.Nome;
import Comunicacao.NovoJogo;
import Comunicacao.Numero;
import Comunicacao.QuemJoga;
import Controller.Console;
import Controller.ControleJogo;
import Controller.Mensagem;
import Controller.Testes;
import Model.PecaO;
import Model.PecaX;
import Model.Tabuleiro;

@SuppressWarnings("serial")
public class Servidor extends Thread implements Serializable {
	
	private ObjectInputStream input1;
	private ObjectInputStream input2;
	private ServerSocket servidor;
	private Socket socket1;
	private Socket socket2;
	private boolean conexaoAtiva;
	private int porta;
	private Mensagem mensagem;
	private Tabuleiro tabuleiro;
	private String nomeJogador1;
	private String nomeJogador2;
	private int vezJogar;
	private int jogadas;
	
	public Servidor(int porta)throws IOException{
		setPorta(porta);
		setSocket1(new Socket());
		setSocket2(new Socket());
		setConexaoAtiva(false);
		setTabuleiro(new Tabuleiro());
		setVezJogar(1);
	}

	public void run(){
		try{
			createServer();
			setConexaoAtiva(true);
			setMensagem(new Mensagem());
			getMensagem().geraMensagemPrograma("Servidor criado na porta: " + getPorta());
			Console.addMensagem(getMensagem());
			
			while(isConexaoAtiva()){
				if(!getSocket1().isConnected()){
					setSocket1(getServidor().accept());
					enviaNumero(new Numero(1), getSocket1());
					setMensagem(new Mensagem());
					getMensagem().geraMensagemPrograma("Conectado, aguardando outro jogador...");
					enviaObjetoJogador1(getMensagem());
					
					(new Thread() {

						public void run() {
							
							while (isConexaoAtiva()) {
								try{
									if(getSocket1().getInputStream() != null){
										setInput1(new ObjectInputStream(getSocket1().getInputStream()));
										recebeObjeto(getInput1());
									}
								}catch(Exception e){
									e.printStackTrace();
								}
							}
						}

					}).start();
				}else{
					if(!getSocket2().isConnected()){
						setSocket2(getServidor().accept());
						enviaNumero(new Numero(2), getSocket2());
						setMensagem(new Mensagem());
						getMensagem().geraMensagemPrograma("Jogadores conectados...");
						enviaObjetoJogador1(getMensagem());
						enviaObjetoJogador2(getMensagem());
			
						(new Thread() {

							public void run() {
								
								while (isConexaoAtiva()) {
									try{
										if(getSocket2().getInputStream() != null){
											setInput2(new ObjectInputStream(getSocket2().getInputStream()));
											recebeObjeto(getInput2());
										}
									}catch(Exception e){
										e.printStackTrace();
									}
								}
							}

						}).start();
						
					}
				}
				
				
				try {
					Thread.sleep(500L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void enviaObjetoJogador1(Object objeto) {
		if (objeto != null) {
			try {
				ObjectOutputStream ob = new ObjectOutputStream(getSocket1().getOutputStream());
				ob.writeObject(objeto);
				ob.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void enviaObjetoJogador2(Object objeto) {
		if (objeto != null) {
			try {
				ObjectOutputStream ob = new ObjectOutputStream(getSocket2().getOutputStream());
				ob.writeObject(objeto);
				ob.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void recebeObjeto(ObjectInputStream ob) {
		if (ob != null) {
			try {
				Object objeto = ob.readObject();

				if (objeto instanceof Mensagem) {
					Mensagem msg = (Mensagem) objeto;
					enviaObjetoJogador1(msg);
					enviaObjetoJogador2(msg);
				}
				
				if(objeto instanceof NovoJogo){
					setTabuleiro(new Tabuleiro());
					enviaTabuleiro(getSocket1());
					enviaTabuleiro(getSocket2());
					ControleJogo.setStart(true);
					setJogadas(0);
					if(getVezJogar()==1){
		    			  enviaQuemJoga(new QuemJoga(new PecaX(), getNomeJogador1()), getSocket1());
		    			  enviaQuemJoga(new QuemJoga(new PecaX(), getNomeJogador1()), getSocket2());
		    		  }else if(getVezJogar()==2){
		    			  enviaQuemJoga(new QuemJoga(new PecaO(), getNomeJogador2()), getSocket1());
		    			  enviaQuemJoga(new QuemJoga(new PecaO(), getNomeJogador2()), getSocket2());
		    		  }
					setMensagem(new Mensagem());
					getMensagem().geraMensagemPrograma("Novo jogo iniciado...");
					enviaObjetoJogador1(getMensagem());
					enviaObjetoJogador2(getMensagem());
				}
				
				if(objeto instanceof Jogada){
					if(ControleJogo.isStart()){
					   Jogada jogada = (Jogada) objeto;
					   if(jogada.getNumero() == getVezJogar()){
					      getTabuleiro().addPecaTabuleiro(jogada.getPeca(), jogada.getX(), jogada.getY());
					      setJogadas(getJogadas()+1);
					      enviaTabuleiro(getSocket1());
					      enviaTabuleiro(getSocket2());
					      Testes teste = new Testes();
					      boolean vencedor = teste.verJogada(getTabuleiro(), jogada.getPeca(), jogada.getX(), jogada.getY());
					      if(!vencedor){
					    	  if(getJogadas()<9){
					    		  trocaJogador();
					    		  if(getVezJogar()==1){
					    			  enviaQuemJoga(new QuemJoga(new PecaX(), getNomeJogador1()), getSocket1());
					    			  enviaQuemJoga(new QuemJoga(new PecaX(), getNomeJogador1()), getSocket2());
					    		  }else if(getVezJogar()==2){
					    			  enviaQuemJoga(new QuemJoga(new PecaO(), getNomeJogador2()), getSocket1());
					    			  enviaQuemJoga(new QuemJoga(new PecaO(), getNomeJogador2()), getSocket2());
					    		  }
					    	  }else{
					    		  setMensagem(new Mensagem());
					    		  getMensagem().geraMensagemPrograma("Jogo terminou empatado!");
					    		  enviaObjetoJogador1(getMensagem());
					    		  enviaObjetoJogador2(getMensagem());
					    		  ControleJogo.setStart(false);
					    		  trocaJogador();
					    	  }
					      }else{
					    	  ControleJogo.setStart(false);
					    	  setMensagem(new Mensagem());
					    	  getMensagem().geraMensagemPrograma("Jogo acabou, vencedor foi: "+jogada.getNome());
					    	  enviaObjetoJogador1(getMensagem());
					    	  enviaObjetoJogador2(getMensagem());
					    	  trocaJogador();
					      }		      
					   }
					}
				}
				
				if(objeto instanceof Nome){
					Nome nome = (Nome) objeto;
					if(nome.getNumero()==1){
						setNomeJogador1(nome.getNome());
					}else if(nome.getNumero()==2){
						setNomeJogador2(nome.getNome());
					}
				}

			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} else {
			return;
		}
	}
	
	public void createServer()throws IOException{
		setServidor(new ServerSocket(getPorta()));
	}
	
	public void enviaNumero(Numero numero, Socket socket) {
		try {
			ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
			saida.writeObject(numero);
			saida.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void enviaQuemJoga(QuemJoga quemJoga, Socket socket) {
		try {
			ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
			saida.writeObject(quemJoga);
			saida.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void enviaTabuleiro(Socket socket){
		try{
			ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
			saida.writeObject(getTabuleiro());
			saida.flush();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void trocaJogador(){
		boolean mudou = false;
		if(getVezJogar() == 1){
			setVezJogar(2);
			mudou = true;
		}
		if(!mudou){
		   if(getVezJogar() == 2){
			   setVezJogar(1);
		   }
		}
	}
	
	public ObjectInputStream getInput1() {
		return input1;
	}

	public void setInput1(ObjectInputStream input1) {
		this.input1 = input1;
	}

	public ObjectInputStream getInput2() {
		return input2;
	}

	public void setInput2(ObjectInputStream input2) {
		this.input2 = input2;
	}

	public ServerSocket getServidor() {
		return servidor;
	}

	public void setServidor(ServerSocket servidor) {
		this.servidor = servidor;
	}

	public Socket getSocket1() {
		return socket1;
	}

	public void setSocket1(Socket socket1) {
		this.socket1 = socket1;
	}

	public Socket getSocket2() {
		return socket2;
	}

	public void setSocket2(Socket socket2) {
		this.socket2 = socket2;
	}

	public boolean isConexaoAtiva() {
		return conexaoAtiva;
	}

	public void setConexaoAtiva(boolean conexaoAtiva) {
		this.conexaoAtiva = conexaoAtiva;
	}

	public int getPorta() {
		return porta;
	}

	public void setPorta(int porta) {
		this.porta = porta;
	}

	public Mensagem getMensagem() {
		return mensagem;
	}

	public void setMensagem(Mensagem mensagem) {
		this.mensagem = mensagem;
	}

	public Tabuleiro getTabuleiro() {
		return tabuleiro;
	}

	public void setTabuleiro(Tabuleiro tabuleiro) {
		this.tabuleiro = tabuleiro;
	}

	public String getNomeJogador1() {
		return nomeJogador1;
	}

	public void setNomeJogador1(String nomeJogador1) {
		this.nomeJogador1 = nomeJogador1;
	}

	public String getNomeJogador2() {
		return nomeJogador2;
	}

	public void setNomeJogador2(String nomeJogador2) {
		this.nomeJogador2 = nomeJogador2;
	}

	public int getVezJogar() {
		return vezJogar;
	}

	public void setVezJogar(int vezJogar) {
		this.vezJogar = vezJogar;
	}

	public int getJogadas() {
		return jogadas;
	}

	public void setJogadas(int jogadas) {
		this.jogadas = jogadas;
	}
	
	
	
	
	

}
L

O servidor não foi implementado por mim só o cliente.

Como disse funciona normal, envio os parâmetros para login, recebo confirmação, só não consigo enviar outras strings fora do método Run().

marcosharbs

alem de abrir uma thread para o servidor vc deve abrir uma thread para cada cliente conectado
qdo ele se conecta no servidor vc deve abrir uma thread para ficar num loop recebendo dados daquele cliente, e o cliente também deve estar num loop recebendo informacoes do servidor, tp vc deve extender thread tb no cliente e implementar o metodo run() para que ele fique recebendo informacoes algo tipo:

public void run(){
		try{
			setSocket(new Socket(getIp(), getPorta()));
			setConexaoAtiva(true);
			
			while(isConexaoAtiva()){
				try{
					setOis(new ObjectInputStream(getSocket().getInputStream()));
					if(getOis() != null){
						recebeObjeto(getOis());
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
L

Acho que você não entendeu, está funcionando corretamente, eu fico no loop recebendo as informações do servidor normalmente…
O que acontece é que não consigo enviar strings para o servidor fora do método Run().

Criado 16 de janeiro de 2009
Ultima resposta 19 de jan. de 2009
Respostas 4
Participantes 2