1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como criar salas ou grupos com socket em Java?

Olá pessoal, tenho que implementar um chat multiusuário que possibilite a criação de salas e o envio de mensagens privadas. Já implementei o chat multiusuário. Então gostaria de sugestões de como poderia implementar as demais funcionalidade, pois já estou algum tempo procurando na web e não tive nenhum resultado satisfatório. Segue o código que tenho até o momento:

package br.unicentro.cc.client;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import br.unicentro.cc.server.Server;

public class Client {
    private String host;
    private Integer port;
    private Socket client;

    public Client(String host, Integer port) {
        this.host = host;
        this.port = port;
    }

    private void execute() {
        try {
            this.client = new Socket(this.host, this.port);
            try {
                ClientHelper serverHelper = new ClientHelper(this.client.getInputStream());
                new Thread(serverHelper).start();
                Scanner input = new Scanner(System.in);
                PrintStream output = new PrintStream(this.client.getOutputStream());
                while (input.hasNextLine()) {
                    output.println(input.nextLine());
                }
                output.close();
                input.close();
                client.close();
            } catch (IOException e) {
                System.out.println("[Client] Não foi possível mater uma conexão segura com o servidor.");
            }
        } catch (UnknownHostException e) {
            System.out.println("[Client] O servidor " + this.host + ":" + this.port + " não pode ser encontrado.");
        } catch (IOException e) {
            System.out.println("[Client] Erro ao estabelecer conexão com o servidor.");
        }
    }

    public static void main(String[] args) {
        new Client("localhost", Server.PORT).execute();
    }
}
package br.unicentro.cc.client;

import java.io.InputStream;
import java.util.Scanner;

public class ClientHelper implements Runnable {
    private InputStream sever;
    private Scanner buffer;

    public ClientHelper(InputStream server) {
        this.sever = server;
    }

    public void run() {
        buffer = new Scanner(this.sever);
        while (true) {
            System.out.print("[Client] Entre com a mensagem que deseja enviar: \n> ");
            System.out.println("[Client] Mensagem recebida do servidor: " + this.server.toString());
        }
    }
}
package br.unicentro.cc.server;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    private Integer port;
    private Socket client;
    private ServerSocket server;
    private List<PrintStream> clients;
    public static final Integer PORT = 5000;

    public Server(Integer port) {
        this.port = port;
        this.clients = new ArrayList<PrintStream>();
    }

    private void execute() {
        System.out.println("[Server] Inicializando servidor...");
        try {
            this.server = new ServerSocket(this.port);
            System.out.println("[Server] Servidor aguardando conexões...");
        } catch (IOException e) {
            System.out.println("[Server] A porta " + this.port + "ocupada. Tente mais tarde.");
        }
        while (true) {
            try {
                this.client = this.server.accept();
                System.out
                        .println("[Server] Nova conexão com o cliente: " + this.client.getInetAddress().getHostName());
                PrintStream output = new PrintStream(this.client.getOutputStream(), true);
                this.clients.add(output);
                ServerHelper clientHelper = new ServerHelper(this.client.getInputStream(), this);
                new Thread(clientHelper).start();
            } catch (IOException e) {
                System.out.println("[Server] Não foi possível estabeler conexão com o cliente.");
            }
        }
    }

    public void broadcast(String message) {
        for (PrintStream client : this.clients) {
            client.println(message);
        }
    }

    public static void main(String[] args) {
        new Server(Server.PORT).execute();
    }
}
package br.unicentro.cc.server;

import java.io.InputStream;
import java.util.Scanner;

public class ServerHelper implements Runnable {
    private InputStream client;
    private Server server;

    public ServerHelper(InputStream client, Server server) {
        this.client = client;
        this.server = server;
    }

    @Override
    public void run() {
        Scanner buffer = new Scanner(this.client);
        while (buffer.hasNextLine()) {
            String message = buffer.nextLine().toString();
            System.out.println("[Server] Mensagem recebida do cliente: " + message);
            this.server.broadcast(message);
        }
        buffer.close();
    }
}

Desde já obrigado.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java sockets threads ou faça a sua própria pergunta.