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?