Execício do livro não funciona?

3 respostas
G

Oi pessoal do GUJ.

Estou com uma dúvida em relação ao execício sobre Sockets no livro Use a Cabeça: Java. Estou tentando criar um aplicativo que dê conselhos aleatórios quando o usuário (client) se conecta ao servidor (host/server). Mas quando eu rodo o aplicativo, nada acontece, não recebo conselho algum! Aqui está o meu código:

package app.sockettest;

import java.io.*;
import java.net.*;

public class SocketApp {

    String[] listaConselhos = {"Coma devagar e mastigue mais.", "Viva o presente!",
    "Durma bem.", "Pratique um exercício físico."};

    public void configureSocket() {
       try {
           ServerSocket sSock = new ServerSocket(3636);

           while(true) {
               Socket sock = sSock.accept();

               PrintWriter writer = new PrintWriter(sock.getOutputStream());
               String conselho = getConselho();
               writer.close();
               System.out.println(conselho);
           }

       } catch(IOException e) {
           e.printStackTrace();
       }
    }

    public String getConselho() {
        int random = (int) (Math.random() * listaConselhos.length);
        return listaConselhos[random];
    }

    public static void main(String[] args) {
        SocketApp app = new SocketApp();
        app.configureSocket();
    }
}

Não há nenhum envio de StackTrace, então isso mostra que ele conectou. (?)

3 Respostas

romarcio

Seu código está correto, porem quando coloca para rodar ele deve parar nessa linha: Socket sock = sSock.accept(); e ficar esperando um socket do tipo cliente se conectar a mesma porta e enviar uma mensagem.

Quando essa mensagem for enviada, seu código passa a executar as próximas linhas e então realizar o seu random.

Crie um socket cliente, inicie o seu que é o servidor e depois o cliente, e verá que funciona.

G

Eu não estou achando no livro aqui, ou não estou entendendo. Tu podes me mostrar como conectar um client?

romarcio

Aqui um exemplo de cliente para socket

public class SocketClient {

    private static boolean encerrar = false;

    public void configureSocket() {
        try {

            //Instancia do atributo conexao do tipo Socket, conecta a IP do Servidor, Porta
            Socket conexao = new Socket("127.0.0.1", 3636);

            //Instancia do atributo saida, obtem os objetos que permitem controlar o fluxo de comunicação
            PrintStream saida = new PrintStream(conexao.getOutputStream());

            // enviar antes de tudo o nome do usuário para o Servidor
            BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Digite seu nome: ");
            String meuNome = teclado.readLine();

            //envia o nome digitado para o servidor
            saida.println(meuNome);

            //Cria a variavel msg responsavel por enviar a mensagem para o servidor
            String msg;
            while (true) {
                // cria linha para digitação da mensagem e a armazena na variavel msg
                System.out.print("Mensagem > ");
                msg = teclado.readLine();

                //testa se a conexão ainda não está encerrada, se estiver true, cai fora
                if (encerrar) {
                    break;
                }

                // envia a mensagem para o servidor
                saida.println(msg);
            }
        } catch (IOException e) {
            // Caso ocorra alguma excessão de I/O, mostre qual foi.
            System.out.println("Falha na Conexao... .. ." + " IOException: " + e);
        }
    }

    public static void main(String[] args) {
        SocketClient socketClient = new  SocketClient();
        socketClient.configureSocket();
    }

}

1° inicie o seu servidor, depois então inicie esse cliente. Dai depois pode alterar conforme suas necessidades.

Criado 16 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 3
Participantes 2