Chat em Java - Servlet + JSP, utilizando Socket e Threads

Alguém tem algum tutorial de como criar um Chat em Java, utilizando Servlet + JSP.

Eu tenho este exemplo comigo…:

Servidor:

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

public class ServidorSocket extends Thread {

	// Parte que controla as conexões por meio de threads.
	private static Vector CLIENTES;

	// socket deste cliente
	private Socket conexao;

	// nome deste cliente
	private String nomeCliente;
	// lista que armazena nome de CLIENTES
	private static List LISTA_DE_NOMES = new ArrayList();

	// construtor que recebe o socket deste cliente
	public ServidorSocket(Socket socket) {
		this.conexao = socket;
	}

	// testa se nomes são iguais, se for retorna true
	public boolean armazena(String newName) {

		// System.out.println(LISTA_DE_NOMES);
		for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {
			if (LISTA_DE_NOMES.get(i).equals(newName))
				return true;
		}

		// adiciona na lista apenas se não existir
		LISTA_DE_NOMES.add(newName);
		return false;
	}

	// remove da lista os CLIENTES que já deixaram o chat
	public void remove(String oldName) {
		for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {
			if (LISTA_DE_NOMES.get(i).equals(oldName))
				LISTA_DE_NOMES.remove(oldName);
		}
	}

	public static void main(String args[]) {

		// instancia o vetor de CLIENTES conectados
		CLIENTES = new Vector();
		try {

			// cria um socket que fica escutando a porta 5555.
			ServerSocket server = new ServerSocket(1500);
			System.out.println("ServidorSocket rodando na porta 5555");

			// Loop principal.
			while (true) {

				// aguarda algum cliente se conectar.
				// A execução do servidor fica bloqueada na chamada do método
				// accept da
				// classe ServerSocket até que algum cliente se conecte ao
				// servidor.
				// O próprio método desbloqueia e retorna com um objeto da
				// classe Socket
				Socket conexao = server.accept();

				// cria uma nova thread para tratar essa conexão
				Thread t = new ServidorSocket(conexao);
				t.start();
				// voltando ao loop, esperando mais alguém se conectar.
			}
		} catch (IOException e) {

			// caso ocorra alguma excessão de E/S, mostre qual foi.
			System.out.println("IOException: " + e);
		}
	}

	// execução da thread
	public void run() {
		try {

			// objetos que permitem controlar fluxo de comunicação que vem do
			// cliente
			BufferedReader entrada = new BufferedReader(new InputStreamReader(
					this.conexao.getInputStream()));
			PrintStream saida = new PrintStream(this.conexao.getOutputStream());

			// recebe o nome do cliente
			this.nomeCliente = entrada.readLine();

			// chamada ao metodo que testa nomes iguais
			if (armazena(this.nomeCliente)) {
				saida.println("Este nome ja existe! Conecte novamente com outro Nome.");
				CLIENTES.add(saida);

				// fecha a conexao com este cliente
				this.conexao.close();
				return;
			} else {

				// mostra o nome do cliente conectado ao servidor
				System.out.println(this.nomeCliente
						+ " : Conectado ao Servidor!");
			}

			// igual a null encerra a execução
			if (this.nomeCliente == null) {
				return;
			}

			// adiciona os dados de saida do cliente no objeto CLIENTES
			CLIENTES.add(saida);

			// recebe a mensagem do cliente
			String msg = entrada.readLine();

			// Verificar se linha é null (conexão encerrada)
			// Se não for nula, mostra a troca de mensagens entre os CLIENTES
			while (msg != null && !(msg.trim().equals(""))) {

				// reenvia a linha para todos os CLIENTES conectados
				sendToAll(saida, " escreveu: ", msg);

				// espera por uma nova linha.
				msg = entrada.readLine();
			}

			// se cliente enviar linha em branco, mostra a saida no servidor
			System.out.println(this.nomeCliente + " saiu do bate-papo!");

			// se cliente enviar linha em branco, servidor envia mensagem de
			// saida do chat aos CLIENTES conectados
			sendToAll(saida, " saiu", " do bate-papo!");

			// remove nome da lista
			remove(this.nomeCliente);

			// exclui atributos setados ao cliente
			CLIENTES.remove(saida);

			// fecha a conexao com este cliente
			this.conexao.close();
		} catch (IOException e) {

			// Caso ocorra alguma excessão de E/S, mostre qual foi.
			System.out.println("Falha na Conexao... .. ." + " IOException: "
					+ e);
		}
	}

	// enviar uma mensagem para todos, menos para o próprio
	public void sendToAll(PrintStream saida, String acao, String msg)
			throws IOException {
		Enumeration e = CLIENTES.elements();
		while (e.hasMoreElements()) {

			// obtém o fluxo de saída de um dos CLIENTES
			PrintStream chat = (PrintStream) e.nextElement();

			// envia para todos, menos para o próprio usuário
			if (chat != saida) {
				chat.println(this.nomeCliente + acao + msg);
			}
		}
	}
}

Cliente:

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ClienteSocket extends Thread {

	// parte que controla a recepção de mensagens do cliente
	private Socket conexao;

	// construtor que recebe o socket do cliente
	public ClienteSocket(Socket socket) {
		this.conexao = socket;
	}

	public static void main(String args[]) {
		try {

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

			// Instancia do atributo saida, obtem os objetos que permitem
			// controlar o fluxo de comunicação
			PrintStream saida = new PrintStream(socket.getOutputStream());
			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.toUpperCase());

			// instancia a thread para ip e porta conectados e depois inicia ela
			Thread thread = new ClienteSocket(socket);
			thread.start();

			// 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();

				// envia a mensagem para o servidor
				saida.println(msg);
			}
		} catch (IOException e) {
			System.out.println("Falha na Conexao... .. ." + " IOException: "
					+ e);
		}
	}

	// execução da thread
	public void run() {
		try {

			// recebe mensagens de outro cliente através do servidor
			BufferedReader entrada = new BufferedReader(new InputStreamReader(
					this.conexao.getInputStream()));

			// cria variavel de mensagem
			String msg;
			while (true) {

				// pega o que o servidor enviou
				msg = entrada.readLine();

				// se a mensagem contiver dados, passa pelo if, caso contrario
				// cai no break e encerra a conexao
				if (msg == null) {
					System.out.println("Conexão encerrada!");
					System.exit(0);
				}
				System.out.println();

				// imprime a mensagem recebida
				System.out.println(msg);

				// cria uma linha visual para resposta
				System.out.print("Responder > ");
			}
		} catch (IOException e) {

			// caso ocorra alguma exceção de E/S, mostra qual foi.
			System.out.println("Ocorreu uma Falha... .. ." + " IOException: "
					+ e);
		}
	}
}

Ele funciona como um CHAT normal… só que eu gostaria de colocar pra funcionar na WEB, utilizando Servlet + JSP… como eu havia falado… =/ Ajudaaa ?

ficou meio vago sua duvida: primeiramente, vc sabe JSP e Servlets? Se nao souber fica dificil fazer…

Se souber, qual tua duvida? arquitetura?

eu sei Servlet + JSP… Só que a minha aplicação está rodando em “Java Application”… pelo public void static main…

eu gostaria de desenvolver para WEB…
Utilizando SERVLET + JSP…

Exemplo:

Usuário digita o nome e já vai para a tela do CHAT… entendeu ?

do jeito que está… só funciona pelo MAIN… gostaria de colocar SERVLET + JSP… entendeu amigo ?

Obrigado. :smiley:

Não tem um tutorial disso no guj mesmo?? Dá uma procurada ai…

Alguém podeia ajudar?? Também estou com a mesma dúvida.

Algum tempo atraz precisei fazer um chat.
Então resolvi procurar na internet se alguém já não havia feito pra mim … .hehehehe

E achei; olha aí :

http://www.web-tech-india.com/software/jsp_chat.php

Funciona direitinho é só baixar os fontes e rodar.

Para testar use browsers diferentes .

Um dos projetos de exemplo do NetBeans é um chat.

Ele já utiliza os recursos assincronos do servlet 3.0 e um tipo de ajax reverso indicado para esse tipo de situação.

Na verdade minha dúvida é se tem como utilizar socket junto com J2EE.