Dúvida em relação à sockets e bate-papo

0 respostas
G

Olá!

Estou tentando montar uma sala de batepapo. Pesquisei no fórum e achei vários tópicos e exemplos de códigos que funfionam perfeitamente, porém a maioria desses exemplos funcionam em um único programa, ou seja são passados argumentos para o método principal para que ocorra a inicialização de um servidor ou de um client.

public class SimpleChat
{
    public static void main(String[] args)
    {
        if (args.length < 2)
        {
            System.out.println("Número inválido de argumentos!");
            return;
        }

        if (args[0].equals("-server"))
        {
            new SimpleChat().startServer(Integer.parseInt(args[1]));
            return;
        }

        if (args[0].equals("-client"))
        {
            new SimpleChat().startClient(args[1], Integer.parseInt(args[2]));
            return;
        }

        System.out.println("Argumento inválido " + args[0]);
    }

    private void startClient(String host, int port)
    {
        try
        {
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress(host, port));
            chat(socket);
        }
        catch (UnknownHostException e)
        {
            System.out.println("Host desconhecido");
            System.out.println("Host: " + host);
            System.out.println("Porta: " + port);
            System.exit(2);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private void startServer(int porta)
    {
        try
        {
            ServerSocket socket = new ServerSocket(porta);
            System.out.println("Aguardando conexao...");
            Socket s = socket.accept();
            chat(s);
        } catch (IOException e)
        {
            System.out.println("Problemas na comunicação: ");
            e.printStackTrace();
            System.exit(1);
        }
    }

    private void chat(Socket s) throws IOException
    {
        System.out.println("Conectado com " + s.getRemoteSocketAddress());
        listen(s.getInputStream());
        talk(s.getOutputStream());
    }

    /**
     * @param outputStream
     */
    private void talk(OutputStream outputStream) throws IOException
    {
        DataOutputStream output = new DataOutputStream(outputStream);
        String line = "";
        while (!line.equals("EXIT"))
        {
            Scanner scan = new Scanner(System.in);
            line = scan.nextLine();
            output.writeInt(line.length());
            for (char ch : line.toCharArray())
                output.writeChar(ch);
            output.flush();
        }
    }

    /**
     * @param inputStream
     */
    private void listen(final InputStream inputStream)
    {
        new Thread(new Runnable() {
            DataInputStream ds = new DataInputStream(inputStream);
            public void run()
            {
                try
                {
                    while (true)
                    {
                        int size = ds.readInt();
                        int cont = 0;
                        char[] chars = new char[size];
                        while (cont < size)
                        {
                            chars[cont] = ds.readChar();
                            cont = cont + 1;
                        }

                        String str = new String(chars);
                        if (str.equals("EXIT"))
                        {
                            System.out.println("Conversa terminada.");
                            System.exit(0);
                        }

                        System.out.println(str);
                    }
                } catch (IOException e)
                {
                }
            }
        }).start();
    }
}

Como podem ver, só há um método "ouvinte" - listen(final InputStream inputStream) - e um método que "fala" - talk(OutputStream outputStream). A minha dúvida:
- Se eu fosse fazer esse chat em programas separados - um o servidor e outro o client - seria necessário o servidor ter um fluxo de entrada e outro de saída e cada client que se conectar ter seu fluxo de entrada e saída próprios?

Desculpe escrever tanto para uma pergunta tão pequena, mas meu propósito era oferecer o maior número de informações para que eu possa ser compreendido.
Grato desde já, Gustavo Borba.

Criado 4 de janeiro de 2011
Respostas 0
Participantes 1