Dúvida jogo da forca

21 respostas
S

galera tenho um trabalho pra fazer na facul pra hj (sexta)…
consegui chegar ate aqui, mas n to conseguindo conectar!

ajudem-me por favor.

servidor:

import java.net.*;
import java.io.*;
public class Servidor {
/**Método Main.
* @param args
* @exception IOException
*/
public static void main(String[] args) throws IOException {
       ServerSocket serverSocket = null;
       try {
           serverSocket = new ServerSocket(5555);
       } catch (IOException e) {
           System.err.println("Nao foi possivel abrir a porta: 5555.");
           System.exit(1);
       }
       Socket clientSocket = null;
       try {
           clientSocket = serverSocket.accept();
       } catch (IOException e) {
           System.err.println("Socket nao aceito.");
           System.exit(1);
       }
       PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
       BufferedReader in = new BufferedReader(
               new InputStreamReader(
               clientSocket.getInputStream()));
       String inputLine, outputLine;
       Forca_protocolo forcaprot = new Forca_protocolo();
       outputLine = forcaprot.processInput(null);
       out.println(outputLine);
       while ((inputLine = in.readLine()) != null) {
           outputLine = forcaprot.processInput(inputLine);
           out.println(outputLine);
           if (outputLine.equals("TCHAU")) {
               break;
           }
       }
/**Método responsável por fechar a instancia da classe PrintWriter ao final da execução
*/
       out.close();
/**Método responsável por fechar a instancia da classe BufferedReader ao final da execução
*/
       in.close();
/**Método responsável por fechar a instancia da classe Socket ao final da execução
*/
       clientSocket.close();
/**Método responsável por fechar a instancia da classe ServerSocket ao final da execução
*/
       serverSocket.close();
   }
}

jogo:

public class Forca_protocolo {
   private static int INICIO = 0;
   private static int TENTATIVA = 1;
   private static int DECISAO = 3;
   private String palavravez = "";
   private int npalavra,  dica,  tamanho = 0;
   private int state = INICIO;
   private String[] dicas = {"Sofre destilacao fracionada.", "Nao renovavel.", "Materia prima para gasolina.",
       "Utilizada para descanso.", "Deve ser regulada de acordo com o usuario.", "utiliza-se em mesas.",
       "Utilizada para unir supeficies.", "Nome dado a copias e provas.", "Pode ser liquida.",
       "Aparelhos utilizados pelas donas de casa.", "Liquidificador e um exemplo.", "Geladeira e um exemplo.",
       "Ciencia iniciada em E e final em A.", "Pode ser analogica ou digital.", "Forma de controlar energia eletrica.",
       "Suporte a um meio de transporte.", "Norte-Sul e um exemplo.", "Sistema baseado em trens.",
       "Substantivo abstrato.", "Começa com P e termina com O.", "Sinonimo de aflicao.",
       "Aplicacao de algum conhecimento com bom senso.", "Eletrica e um exemplo.", "CREA e o conselho da classe.",
       "Sistema operacional.", "Inspirado no minix.", "Slackware e um exemplo.",
       "Circuito integrado.", "Realiza calculos.", "Pentium e um exemplo."};
   private String[] palavras = {"PETROLEO", "CADEIRA", "COLA", "ELETRODOMESTICOS", "ELETRONICA", "FERROVIA",
       "PREOCUPACAO", "ENGENHARIA", "LINUX", "PROCESSADOR"};
    /**Retorna mensagens que são enviadas ao cliente, variavel theOutput
    * @param Recebe como parametro a entrada do usuário pelo teclado
    * @return theOutput
    */
    public String processInput(String theInput) {
    String theOutput = null;
      if (state == INICIO) {
           npalavra = (int) (Math.random() * 10);//indice da palavra sorteada palavra
           dica = getNpalavra() * 3;
           palavravez = getPalavras()[getNpalavra()]; // palavra cujo indice foi sorteado
           tamanho = getPalavravez().length(); // tamanho da palavra
           theOutput = "Bem vindo ao JOGO DA FORCA. Qual a palavra? DICA: " + getDicas()[dica];
           state = TENTATIVA;
       } else if (state == TENTATIVA) {
           if (theInput.equalsIgnoreCase(getPalavravez())) {
               theOutput = "PARABENS, VOCE ACERTOU! Deseja jogar novamente? (S/N)";
               state = DECISAO;
           } else {
               dica++;
               if ((dica / 3) == getNpalavra()) {
                   theOutput = "Ai vai outra dica: " + getDicas()[dica];
               } else {
                   theOutput = "VOCE FOI ENFORCADO. A palavra era: " + getPalavravez() + ". Quer jogar novamente? (S/N)";
                   state = DECISAO;
               }
           }
       } else if (state == DECISAO) {
           if (theInput.equalsIgnoreCase("S")) {
               theOutput = "PRESSIONE UMA TECLA PARA COMECAR";
               state = INICIO;
           } else {
               theOutput = "TCHAU";
           }
       }
       return theOutput;
   }
   /**Retorna a palavra que deve ser adivinhada
    * @return palavravez
    */
   public String getPalavravez() {
       return palavravez;
   }
   /**Retorna o indice da palavra sorteada
    * @return npalavra
    */
   public int getNpalavra() {
       return npalavra;
   }
   /**Retorna uma dica referente a palavara
    * @return dicas
    */
   public String[] getDicas() {
       return dicas;
   }
   /**Retorna o vetor de palavras
    * @return palavras
    */
   public String[] getPalavras() {
       return palavras;
   }
 }

agradeço desde já

EDIT - Por favor, use um título mais adequado (“heeeelp” não ajuda muito aqui; boa parte dos que costumam ajudar nem olham seus tópicos se você ficar pedindo ajuda desse jeito. )

21 Respostas

Trevisani

Nao consegue conectar porque?
Qual erro que da?
Ou nao da erro e a aplicacao tranca?

S

Apenas aparece no console:

Nao foi possivel abrir a porta: 5555.

ja tentei mudar a porta mas o erro persiste.

S

Eu coloco ele pra rodar, blz, roda, n sai do canto.

qdo tento rodar de novo, ele da o erro mencionado.

Trevisani

Cola ai a stackTrace que o erro gerou

Trevisani

Aah sim, para isso substitua linhas como essa:

System.err.println("Nao foi possivel abrir a porta: 5555.");

por essa:

e.printStackTrace();
S

vou tentar.

S

rodou, qdo tentei d novo :

java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind

at java.net.PlainSocketImpl.socketBind(Native Method)

at java.net.PlainSocketImpl.bind(Unknown Source)

at java.net.ServerSocket.bind(Unknown Source)

at java.net.ServerSocket.(Unknown Source)

at java.net.ServerSocket.(Unknown Source)

at Servidor.main(Servidor.java:11)

:frowning:

Trevisani

Aha! Agora sim temos um problema…
E eu nao tenho a resposta :?

Nunca vi acontecer isso, mas… procura por isso no google, que eu vou dar uma googlada aqui tambem:
Unrecognized Windows Sockets error: 0

Trevisani

Nao achei nada de util… tenho que ir dormir =/

Mas se eu fosse chutar, chutaria que eh problema no teu windows, ou algo assim… porque a principio teu codigo nao tem nada de mais, nao deveria gerar um erro desses…
Se tu nao achar nada no google, e ninguem mais tiver alguma resposta, tenta re-instalar a Java SDK… ou tenta reinstalar o sockets do windows… nao sei se isso tem como… mas… e verifica tambem se tu baixou as atualizacoes do windows, se nao tem alguem programa que possa bloquear abertura de conexoes, tipo firewall ou sei la…

Na pior das hipoteses, tenta conseguir outro computador, e bota pra rodar em outro, que suspeito que o problema e a tua maquina.

Depois posta ai o que tu conseguiu ou nao fazer.

Andre Trevisani

S

Pelo que estou entendendo ele estar dando erro na socket, na linha 11 do servidor, pelo fato de n poder usar a mesma porta 2 vezes, visto que a mesma ainda estar sendo utilizada.

ate ai blz, mas pq n inicia o jogo na primeira vez que executa?

E obg por estar ajudando Trevisani

Trevisani

Ah, e se tu ainda nao tentou reiniciar a maquina pra ver se funciona… reinicia. As vezes tem alguma coisa pendurada na VM ou no proprio Windows e um simples reboot no sistema corrige.

Se ainda assim tu nao conseguir, baixa o vmware, ou qualquer outro programa de maquinas virtuais, instala, cria uma maquina virtual, poe linux nela, e programa la dentro… eh meio gambiarra… demora um tempao… mas ja que tu tem que entregar esse treco pra hoje…

Trevisani

Pois eh, da primeira vez pelo que eu vi da esse erro maluco ai “windows socket error 0”, nao lembro bem…
Se o programa continua funcionando, e tu abrir outro, ai sim vai dar erro de tentativa de usar uma porta que ja esta sendo usada… o que eh meio loucura tambem, visto que se deu erro da primeira vez, era pra dar System.exit… e finalizar a aplicacao, entao nao deveria ter ninguem usando aquela porta…

Tenta reiniciar o pc, e abrir uma vez so e ve se passa daquela linha, tipo, bota um print “passou!”, se nao passar da primeira vez, tenta trocar a porta (vai que tem um programa ai que usa a 5555 neh…) se ainda assim nao passar… ai tenta pra ver se tem alguem aqui no forum que saiba a resposta… agora, se estiver chegando perto do final do prazo… tenta fazer uma das coisas que eu falei ali em cima.

Agora vou mesmo, amanha venho aqui pra ver quale que era :smiley:

Abraco!

S

blz, vou fazer uns testes, ver se sai algo, to em fim de periodo é isso é a ultima nota!

ViniGodoy

O problema disso é o seguinte. Sempre que uma conexão socket é encerrada, o SO mantém ela reservada por alguns minutos, já que há altas chances dela ser reaberta. Existem comandos próprios do SO para fazer isso.

Para evitar esse problema, após a criação do Socket dê o comando:

serverSocket.setReuseAddress(true);

Isso indica ao SO que você quer conectar nessa porta, mesmo que ela esteja simplesmente aguardando uma nova conexão.

douglasrauber

Opa… Bom dia!

Há algum problema em executar esse código em linux ? Uso ubuntu e quando chega na parte

clientSocket = serverSocket.accept();

simplemente pára a execução, há alguma explicação para isso?

Obrigado

laudenpower

douglasrauber:
Opa… Bom dia!

Há algum problema em executar esse código em linux ? Uso ubuntu e quando chega na parte

clientSocket = serverSocket.accept();

simplemente pára a execução, há alguma explicação para isso?

Obrigado

Se não me engano ele para nessa linha por que fica esperando algum client se conectar nele, quando isso acontece ele pega o socket retornado pelo método accept e continua as operações.

Espero ter ajudado :slight_smile:

douglasrauber

Ahhh… Então ta faltando a classe Cliente do socket :?:

Será que o autor pode postar ela para fins didáticos ?

Obrigado

Douglas :smiley:

B

laudenpower:
douglasrauber:
Opa… Bom dia!

Há algum problema em executar esse código em linux ? Uso ubuntu e quando chega na parte

clientSocket = serverSocket.accept();

simplemente pára a execução, há alguma explicação para isso?

Obrigado

Se não me engano ele para nessa linha por que fica esperando algum client se conectar nele, quando isso acontece ele pega o socket retornado pelo método accept e continua as operações.

Espero ter ajudado :slight_smile:

Por esses motivos que a espera da entrada de conexões é implementada com threads, para não travar o servidor.

laudenpower

Bruno Laturner:
laudenpower:
douglasrauber:
Opa… Bom dia!

Há algum problema em executar esse código em linux ? Uso ubuntu e quando chega na parte

clientSocket = serverSocket.accept();

simplemente pára a execução, há alguma explicação para isso?

Obrigado

Se não me engano ele para nessa linha por que fica esperando algum client se conectar nele, quando isso acontece ele pega o socket retornado pelo método accept e continua as operações.

Espero ter ajudado :slight_smile:

Por esses motivos que a espera da entrada de conexões é implementada com threads, para não travar o servidor.

Bom pelo que eu entendo o servidor na verdade espera que alguém se conecte na porta que ele está ouvindo, nesse caso não quer dizer que o server trave até mesmo por que ele trabalha com uma fila de clientes logo se algum cliente chega depois ele é colocado na fila para ser processado posteiormente. O uso de Threads se justifica quando se necessita atender um número maior de clientes que acessam a mesma porta.

S

OK, vou testar e posto o resultado!

obg

S

é realmente ta sem conexao do cliente, eu pensava que a propria classe do servidor podia chamar a aplicaçao “cliente”, vou fazer modificaçoes.

Criado 9 de julho de 2009
Ultima resposta 10 de jul. de 2009
Respostas 21
Participantes 6