comunicação socket - client

Galera to fazendo um trabalho da faculdade que basicamente é fazer um chat multi-usuario com interface swing simples, mais estou tendo algumas duvidas não se estou fazendo da maneiro correta,

//essa é a classe responsavel por comunicar a aplicação com o servidor

package br.com.util;

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

import br.com.domain.Usuario;

public class ConectarServidor {

	private static Socket socket = null;
	private static boolean isError = false;
	
	public static void RealizarCadastro(Usuario usuario) throws Exception {

			enviarRequisicao("registro", usuario);

	}
	
	
	private static Socket getSocket() throws Exception {
		if (ConectarServidor.socket == null) {
			ConectarServidor.socket = new Socket("127.0.0.1", 5555);
		}
		return ConectarServidor.socket;
	}
	
	private static void enviarRequisicao(String action, Object object) throws Exception {
        //Instancia do atributo saida, obtem os objetos que permitem controlar o fluxo de comunicação
		Socket socket = getSocket();
		PrintStream saida = new PrintStream(socket.getOutputStream());
		saida.println(action); //envia para o servidor qual ação ele vai executar
		realizarAcao(action, object, saida);
	}
	
	private static void realizarAcao(String action, Object object, PrintStream saida) throws Exception {
		Socket socket = getSocket();
		BufferedReader entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//realiza a ação
		if (action.equals("registro")) {
			Usuario usuario =  (Usuario) object;
			String registro = "nickName:"+usuario.getNome() + "," + "senha"+":"+usuario.getSenha();
			saida.println(registro); //aqui envia para o servidor o registro do usuario
                      // isError --> minha duvida é nesse ponto eu preciso que o servidor me retorne se deu ou não certo o que eu mandei ele fazer
			String response = entrada.readLine();//aqui ele pega a mensagem do servidor
			throw new Exception(response); // manda pra aplicação a resposta
		}

	}
}


//aqui é a classe do servidor
package br.com.server;

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.HashMap;
import java.util.List;
import java.util.Map;

public class ServidorSocket extends Thread {
	private Socket conexao;

	public ServidorSocket(Socket socket) {
		this.conexao = socket;
	}

	public static void main(String args[]) {
		try {
			ServerSocket server = new ServerSocket(5555);
			System.out.println("ServidorSocket rodando na porta 5555");
			while (true) {
				Socket conexao = server.accept();
				Thread t = new ServidorSocket(conexao);
				t.start();
			}
		} catch (IOException e) {
			System.out.println("IOException: " + e);
		}
	}

	public void run() {
		try {
			verificarAcao();
			
		} catch (IOException e) {
			System.out.println("Falha na Conexao... .. ." + " IOException: "
					+ e);
		} catch (Exception e) {
			System.out.println("erro");
		}
	}
	
	public void verificarAcao() throws Exception {
		PrintStream saida = new PrintStream(this.conexao.getOutputStream());
		BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream()));
		//pega a ação
		String action = entrada.readLine();
		
		if (action.equals("registro")) {
			String registro = entrada.readLine();
			String[] user = registro.split(",");
			String nickName = user[0].split(":")[1];
			if (verificarDisponibilidadeUsuario(nickName)) {
				//inserir no banco; FIXME
				saida.print(false); //manda false para a aplicação informando que não ocorreu erro;
				saida.println("Registro Salvo!");
			} else {
				saida.print(true);
				saida.println("Nome de usuario invalido!\nEscolha outro!");
			}
		}
		this.conexao.close();
	}
	
	public boolean verificarDisponibilidadeUsuario(String nickName) {
		//inserir aqui uma consulta verificando o nome do usuario FIXME
		return true;
	}
	
}

se puderem me dar a opinião de vc’s de como melhorar esse código ou de uma forma melhor de fazer.

danilorangelmg.

Cara, já que você quer fazer um chat multi usuario, seria legal você usar BroadCast pra saber quando o usuario abriu o programa.
Vc iria saber quais que estão logados.

Parte Servidor


public class Main {

	public static final int PORT = 9512;

	/**
	 * @param args
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws IOException, InterruptedException {
		DatagramSocket ss = new DatagramSocket();
		ss.setBroadcast(true);
		byte[] b = new byte[100];
		DatagramPacket p = new DatagramPacket(b, b.length);
		p.setAddress(InetAddress.getByAddress(new byte[] { (byte) 255,
		        (byte) 255, (byte) 255, (byte) 255 }));
		p.setPort(PORT);

		int i = 0;
		while (true) {
			String s = new Integer(i++).toString();

			b = s.getBytes();
			p.setData(b);
			ss.send(p);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

Parte Client


	public static void main(String[] args) throws IOException {
		 byte[] receiveData = new byte[100];
		   DatagramSocket clientSocket = new DatagramSocket(9512);
		  DatagramPacket receivePacket =
		          new DatagramPacket(receiveData,
		                       receiveData.length);
		  
		       clientSocket.receive(receivePacket);
		       System.out.println(receivePacket.getAddress());

	}

Ficaria bacana.

como assim?

Eu tive que fazer algo parecido com o que você fez, porém para uso comercial.

Porém no meu caso eu tinha a necessidade de quando o usuário entrasse no programa no Computador 1, informasse a todos qual o ip e a porta para que eles pudesse se conectar.

A melhor forma que achei foi utilizando Broadcast.

Não sei se essa é uma necessidade sua, só achei legal postar, caso precise tá ai.

Vlw.