[RESOLVIDO]Controle de thread do socket

3 respostas
Allan_Barcelos

Olá, estou fazendo um projeto da faculdade sobre um jogo de dominó utilizando socket, mas estou com dificuldades de entender como fazer a comunicação entre os sockets, ja li o artigo aqui do GUJ, me ajudou um pouco mas continuo sem entender. A ideia era criar uma thread para cada novo cliente conectado ao servidor, restringindo o maximo de clientes para 4, vi uma explicação do VinyGodoy sobre utilizar o ClientHandler só que não consegui, sera que alguem poderia me explicar mais ou menos o que posso fazer? Segue abaixo o código da classe Servidor

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.JOptionPane;


public class Servidor extends Thread{
	
	private static Socket connection;
	
	public Servidor(Socket connection) {
		this.connection = connection;
	}

	/** Avalia o que o cliente quis dizer com a mensagem
	 *  Retorna a mensagem ao cliente com: 0 caso a operação tenha falhado e 1 caso a operação foi aceita
	 * @param cadeia
	 * @param mensagem
	 * @return
	 */
	public static Mensagem interpretaMsg(Cadeia cadeia, Mensagem mensagem){
		if(mensagem.getDescricao() == 'C'){
			if(cadeia.getPecasSize() == 0){
				JOptionPane.showMessageDialog(null, "Erro!", "Não tem mais peças para comprar", JOptionPane.ERROR_MESSAGE);
				mensagem.setDescricao('0');  // retorna 0 para o cliente identificar que algo saiu errado e impedir o player de fazer a mesma coisa
				mensagem.setDoJogo(null);
				mensagem.setPecaJogada(null);
				return mensagem;
			}
		}
		else if(mensagem.getDescricao() == 'P'){
			if(cadeia.getPecasSize() == 0){
				// passa para o proximo Cliente
				mensagem.setDescricao('1');
				mensagem.setDoJogo(null);
				mensagem.setPecaJogada(null);
				return mensagem;
			}
				
			
		}
		else if(mensagem.getDescricao() == 'J'){
			if(mensagem.getPlayer().getPecas().size() > 0){
				mensagem.setPlayer(cadeia.colocaPeca(mensagem.getPlayer(), mensagem.getPecaJogada(), mensagem.getPecaJogada()));
				mensagem.setDescricao('1');
				mensagem.setPecaJogada(null);
				mensagem.setDoJogo(null);
				return mensagem;
			}
		}
		return null;
	}
	
	/** Altera o atributo passado para ordenar o jogador com a maior peca */
	private static ArrayList<Jogador> ordenaJogadores(Cadeia cadeia, ArrayList<Jogador> players){
		Jogador p = cadeia.verificaMaior(players);
		int index = -1;
		for(int i = 0; i < players.size(); i++){
			if(players.get(i) == p)
				index = i;
		}
		ArrayList<Jogador> aux = new ArrayList();
		aux.add(players.remove(index));
		for(int i = 0; i < players.size(); i++){
			aux.add(players.remove(i));
		}
		return aux;
	}
	
	// precisa de um método para atualizar a tela
	
	public void run(){
		try{
		ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
		ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream());
		
		output.flush();  // atualiza a conexão
		
		}catch(IOException e){
			e.toString();
		}
		
	}

	public static void main(String[] args) throws Exception{
		
		Mensagem msg;
		Cadeia jogoCadeia;
		ArrayList jogadores;
		
		ServerSocket server = new ServerSocket(500);
		
		while(true){
			
			ClienteHandler handler = new ClientHandler(connection.accept()); 
			Thread t = new Thread(handler);
			t.start();
			
			}
    
    
}
}

Preciso saber se estou no caminho certo e se iniciar uma thread ela não vai gerar outro servidor? Ou vai continuar do ponto aonde foi gerada no código?

3 Respostas

ViniGodoy

Para restringir o acesso, faça o seguinte:

  1. Coloque um contador no seu main.
  2. Faça um for do tipo:

//Recebe uma nova conexão. Socket client = connection.accept(); //Já tem gente demais? if (nrClientes == 4) { //Corta a conexão. client.close(); } else { //Caso contrário, cria a thread para gerenciar esse cliente. ClienteHandler handler = new ClientHandler(client); Thread t = new Thread(handler); t.start(); nrClientes++; }

Allan_Barcelos

Mas esta classe ClientHandler é um import? Ou tenho que monta-la ?

ViniGodoy

Essa classe é o Runnable que vai controlar teu socket. Você tem que monta-la, evidentemente.

Criado 20 de abril de 2012
Ultima resposta 21 de abr. de 2012
Respostas 3
Participantes 2