comunicação socket - client

3 respostas
danilorangelmg

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.

3 Respostas

nilson26

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.

danilorangelmg

como assim?

nilson26

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.

Criado 18 de abril de 2013
Ultima resposta 18 de abr. de 2013
Respostas 3
Participantes 2