olá pessoal,
tenho um trabalho da facul pra fazer um jogo usando socket, pretendo fazer um jogo de pergunta e resposta, só que não estou conseguindo atualizar o label para os dois jogadores quando verifico que dois jogadores estão conectados. Seria assim: um jogador conecta e fica esperando outro se conectar, qnd isso acontece, os labels para os dois jogadores recebem as peguntas.
Minha última tentativa foi tentar pegar o valor do i no for, quando i tivesse dois jogadores, o servidor mandaria tal mensagem pros clientes e através disso eu acho q conseguiria atualizar a janela.
peguei o jogo da velha do deitel como exemplo.
import java.awt.BorderLayout;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.util.Formatter;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class Servidor extends JFrame
{
private JTextArea outputArea; // para gerar saída das jogadas
private Player[] players; // array de Players
private ServerSocket server; // socket de servidor para conectar com clientes
private int currentPlayer; // monitora o jogador com a jogada atual
private final static int PLAYER_1 = 0; // constante para o primeiro jogador
private final static int PLAYER_2 = 1; // constante para o segundo jogador
private final static String[] MARKS = { "0", "1" }; // array de marcas
private ExecutorService runGame; // executará os jogadores
private Lock gameLock; // para bloquear a sincronização do jogo
private Condition otherPlayerConnected; // para esperar outro jogador
//private Condition otherPlayerTurn; // para esperar a jogada do outro jogador
int I=0;
// configura o servidor de tic-tac-toe e a GUI que exibe as mensagens
public Servidor()
{
super( "Game Server" ); // configura o título da janela
// cria ExecutorService com uma thread para cada jogador
runGame = Executors.newFixedThreadPool( 2 );
gameLock = new ReentrantLock(); // cria um bloqueio para o jogo
// variável de condição para os dois jogadores sendo conectados
otherPlayerConnected = gameLock.newCondition();
// variável de condição para a jogada do outro jogador
// otherPlayerTurn = gameLock.newCondition();
players = new Player[ 2 ]; // cria array de jogadores
currentPlayer = PLAYER_1; // configura o jogador atual como o primeiro jogador
try
{
server = new ServerSocket( 12345, 2 ); // configura ServerSocket
} // fim do try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // fim do catch
outputArea = new JTextArea(); // cria JTextArea para saída
add( outputArea, BorderLayout.CENTER );
outputArea.setText( "Server awaiting connections\n" );
setSize( 300, 300 ); // configura o tamanho da janela
setVisible( true ); // mostra a janela
} // fim do construtor TicTacToeServer
// espera duas conexões para que o jogo possa ser jogado
public void execute()
{
// espera que cada cliente se conecte
for ( I = 0; I < players.length; I++ )
{
try // espera a conexão, cria Player, inicia o executável
{
players[ I ] = new Player( server.accept(), I );
runGame.execute( players[ I ] ); // executa o executável de jogador
System.out.println(" i="+I);
} // fim do try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // fim do catch
} // fim do for
returnvalor();
gameLock.lock(); // bloqueia o jogo para sinalizar a thread do jogador X
try
{
players[ PLAYER_1 ].setSuspended( false ); // retoma o jogador X
otherPlayerConnected.signal(); // acorda a thread do jogador X
} // fim do try
finally
{
gameLock.unlock(); // desbloqueia o jogo depois de sinalizar para o jogador X
} // fim de finally
} // fim do método execute
public void returnvalor(){
Player ch = new Player(null, I);
int j =I;
ch.pegavalor(j);
System.out.println("j="+j);
}
// exibe uma mensagem na outputArea
private void displayMessage( final String messageToDisplay )
{
// exibe uma mensagem a partir da thread de despacho de eventos da execução
SwingUtilities.invokeLater(
new Runnable()
{
public void run() // atualiza a outputArea
{
outputArea.append( messageToDisplay ); // adiciona mensagem
} // fim do método run
} // fim da classe inner
); // fim da chamada para SwingUtilities.invokeLater
} // fim do método displayMessage
// classe interna privada Player gerencia cada Player como um executável
private class Player implements Runnable
{
private Socket connection; // conexão com o cliente
private Scanner input; // entrada do cliente
private Formatter output; // saída para o cliente
private int playerNumber; // monitora qual jogador isso é
private int mark; // marca para esse jogador
private boolean suspended = true; // se a thread está suspensa
int i=0;
public void pegavalor(int j){
int i=j;
System.out.println("return i"+i);
}
// configura a thread Player
public Player( Socket socket, int number )
{
playerNumber = number; // armazena o número desse jogador
connection = socket; // armazena o socket para o cliente
try // obtém fluxos a partir de Socket
{
input = new Scanner( connection.getInputStream() );
output = new Formatter( connection.getOutputStream() );
} // fim do try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // fim do catch
} // fim do construtor Player
// execução da thread de controle
public void run()
{
try
{
displayMessage( "Player " + mark + " connected\n" );
output.format( "%s\n", mark ); // envia a marca do jogador
output.flush(); // esvazia a saída
// se for o jogador X, espera que o outro jogador chegue
if ( playerNumber == PLAYER_1 )
{
output.format( "%s\n%s", "Player 1 connected",
"Waiting for another player\n" );
output.flush(); // esvazia a saída
gameLock.lock(); // bloqueia o jogo para esperar o segundo jogador
try
{
while( suspended )
{
otherPlayerConnected.await(); // espera o jogador O
} // fim do while
} // fim de try
catch ( InterruptedException exception )
{
exception.printStackTrace();
} // fim do catch
finally
{
gameLock.unlock(); // desbloqueia o jogo depois do segundo jogador
} // fim de finally
System.out.println("antes i"+i);
if (i==1){
System.out.println("entrou if");
output.format("2 jogadores");
}
// envia uma mensagem de que o outro jogador se conectou
output.flush(); // esvazia a saída
} // fim do if
else
{
output.format( "Player O connected, please wait\n" );
output.flush(); // esvazia a saída
} // fim de else
} // fim do try
finally
{
try
{
connection.close(); // fecha a conexão com o cliente
} // fim do try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // fim do catch
} // fim de finally
} // fim do método run
// configura se a thread está ou não suspensa
public void setSuspended( boolean status )
{
suspended = status; // configura o valor do suspenso
} // fim do método setSuspended
} // fim da classe Player
public static void main( String args[] )
{
Servidor application = new Servidor();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
application.execute();
} // fim de main
} // fim da classe TicTacToeServer
import java.awt.*;
import java.net.Socket;
import java.net.InetAddress;
import java.io.IOException;
import javax.swing.*;
import java.util.Formatter;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class JogoCliente extends JFrame implements Runnable
{
private Socket connection; // conexão com o servidor
private Scanner input; // entrada a partir dprimeiroo servidor
private Formatter output; // saída para o servidor
private String ticTacToeHost; // nome do host para o servidor
private String myMark; // marca desse cliente
private boolean myTurn; // determina de qual cliente é a vez
private final String MARK_1 = "1"; // marca para o primeiro cliente
private final String MARK_2 = "2"; // marca para o segundo cliente
//label
private JLabel tempo = new JLabel("Tempo");
private JLabel nome = new JLabel("Nome");
private JLabel nome2 = new JLabel("Nome2");
private JLabel pontos = new JLabel("Pontos");
private JLabel pontos2 = new JLabel("Pontos2");
private JLabel pergunta = new JLabel("Pergunta");
//string
String alt_a = "alternativa a";
String alt_b = "alternativa b";
String alt_c = "alternativa c";
String alt_d = "alternativa d";
String nomejog;
//radiobutton
JRadioButton rbutton_a = new JRadioButton(alt_a);
JRadioButton rbutton_b = new JRadioButton(alt_b);
JRadioButton rbutton_c = new JRadioButton(alt_c);
JRadioButton rbutton_d = new JRadioButton(alt_d);
JTextArea txtarea = new JTextArea(10,10);
int resp=0,cont=0;
// configura a interface com o usuário e o tabuleiro
public JogoCliente( )
{
ticTacToeHost = "127.0.0.1"; // configura o nome do servidor
GridBagConstraints cons = new GridBagConstraints();
JPanel panel = new JPanel();
cons.ipady=10;
cons.ipadx=10;
panel.setLayout(new GridBagLayout());
cons.fill = GridBagConstraints.NONE;
//tempo
cons. gridwidth=5;
cons.insets = new Insets(100,-40,0,0);
cons.gridx = 1; cons.gridy = 0;
panel.add(tempo, cons);
cons. gridwidth=1;
cons.insets = new Insets(0,0,0,0);
//jogador1
cons.gridx = 0; cons.gridy = 1;
panel.add(nome, cons);
cons.gridx = 0; cons.gridy = 2;
panel.add(pontos, cons);
//pergunta
cons.insets = new Insets(0,20,0,20);
cons. gridwidth=3;
cons.gridx = 1; cons.gridy = 1;
panel.add(pergunta, cons);
//respostas
ButtonGroup group = new ButtonGroup();
cons.gridx = 1; cons.gridy = 3;
panel.add(rbutton_a, cons);
group.add(rbutton_a);
cons.gridx = 1; cons.gridy = 4;
panel.add(rbutton_b, cons);
group.add(rbutton_b);
cons.gridx = 1; cons.gridy = 5;
group.add(rbutton_c);
panel.add(rbutton_c, cons);
cons.gridx = 1; cons.gridy = 6;
panel.add(rbutton_d, cons);
group.add(rbutton_d);
cons. gridheight=1;
cons. gridwidth=1;
cons.insets = new Insets(0,0,0,0);
//jogador 2
cons.gridx = 5; cons.gridy = 1;
panel.add(nome2, cons);
cons.gridx = 5; cons.gridy = 2;
panel.add(pontos2, cons);
setLayout(new BorderLayout());
add("North", panel);
add("South", txtarea);
tempo.setFont(new Font("Courier", Font.BOLD, 16));
tempo.setForeground(Color.RED);
pontos.setForeground(Color.RED);
pontos2.setForeground(Color.RED);
pack();
setVisible(true);
startClient();
} // fim do construtor TicTacToeClient
public void m() {
//nomejog=JOptionPane.showInputDialog(null, "digite um nome");
//nome.setText(nomejog);
random();
}
public void random() {
String perg;
int num = (int) (Math.random() * 10);
System.out.println(num);
switch (num) {
case 1: {
perg="De quantos anos é constituído um século?1";
pergunta.setText(perg);
rbutton_a.setText("50");
rbutton_b.setText("100");
rbutton_c.setText("1000");
rbutton_d.setText("1500");
resp =2;
break;}
case 2: {
perg="Qual é o coletivo de cães?";
pergunta.setText(perg);
rbutton_a.setText("MATILHA");
rbutton_b.setText("REBANHO");
rbutton_c.setText("CARDUME");
rbutton_d.setText("MANADA");
resp =1;
break;}
case 3: {
perg=" Qual é o naipe do baralho que tem o desenho de coração?";
pergunta.setText(perg);
rbutton_a.setText("OUROS");
rbutton_b.setText("PAUS");
rbutton_c.setText("COPAS");
rbutton_d.setText("ESPADAS");
resp =3;
break;}
case 4: {
perg="Qual casal foi expulso do Paraíso?";
pergunta.setText(perg);
rbutton_a.setText("SANSÃO E DALILA");
rbutton_b.setText("JOSÉ E MARIA");
rbutton_c.setText("SARA E ABRAÃO");
rbutton_d.setText("ADÃO E EVA");
resp =4;
break;}
case 5: {
perg="Segundo os contos, qual animal ao ser beijado se transformaem príncipe?";
pergunta.setText(perg);
rbutton_a.setText("CAVALO");
rbutton_b.setText("CÃO");
rbutton_c.setText("GATO");
rbutton_d.setText("SAPO");
resp =4;
break;}
case 6: {
perg=" Em qual parte do corpo humanosão implantadas as ?pontes desafena??";
pergunta.setText(perg);
rbutton_a.setText("ESTÔMAGO");
rbutton_b.setText("INTESTINO");
rbutton_c.setText("PULMÃO");
rbutton_d.setText("CORAÇÃO");
resp =4;
break;}
case 7: {
perg=" Na literatura, quem foi ocriador da boneca Emília?";
pergunta.setText(perg);
rbutton_a.setText("MONTEIRO LOBATO");
rbutton_b.setText("MAURÍCIO DE SOUZA");
rbutton_c.setText("WALT DISNEY");
rbutton_d.setText("JORGE AMADO");
resp =1;
break;}
case 8: {
perg="Quem é o primeiro substitutodo Presidente?";
pergunta.setText(perg);
rbutton_a.setText("VEREADOR");
rbutton_b.setText("VICE-PRESIDENTE");
rbutton_c.setText("SENADOR");
rbutton_d.setText("DEPUTADO");
resp =2;
break;}
case 9: {
perg="Em qual cidade está o CristoRedentor do Corcovado?";
pergunta.setText(perg);
rbutton_a.setText("RIO DE JANEIRO");
rbutton_b.setText("SÃO PAULO");
rbutton_c.setText("CURITIBA");
rbutton_d.setText("BELO HORIZONTE");
resp =1;
break;}
case 10: {
perg=" Quantos centímetros equivalema um metro?";
pergunta.setText(perg);
rbutton_a.setText("10");
rbutton_b.setText("100");
rbutton_c.setText("1000");
rbutton_d.setText("10000");
resp =2;
break;}
}
cont++;
if (cont!=5)
random();
else
{
// random_medio();
}
}
// inicia a thread do cliente
public void startClient()
{
try // conecta-se ao servidor, obtém os fluxos e inicia o outputThread
{
// faz uma conexão com o servidor
connection = new Socket(
InetAddress.getByName( ticTacToeHost ), 12345 );
// obtém os fluxos de entrada e saída
input = new Scanner( connection.getInputStream() );
output = new Formatter( connection.getOutputStream() );
} // fim do try
catch ( IOException ioException )
{
ioException.printStackTrace();
} // fim do catch
// cria e inicia a thread de trabalhador para esse cliente
ExecutorService worker = Executors.newFixedThreadPool( 1 );
worker.execute( this ); // executa o cliente
} // fim do método startClient
// thread de controle que permite atualização contínua da displayArea
public void run()
{
myMark = input.nextLine(); // obtém a marca do jogador (X ou O)
SwingUtilities.invokeLater(
new Runnable()
{
public void run()
{
// exibe a marca do jogador
txtarea.setText( "You are player \"" + myMark + "\"" );
} // fim do método run
} // fim da classe interna anônima
); // fim da chamada para SwingUtilities.invokeLater
// recebe as mensagens enviadas para o cliente e gera saída delas
while ( true )
{
if ( input.hasNextLine() )
processMessage(input.nextLine());
} // fim do while
} // fim do método run
// processa as mensagens recebidas pelo cliente
private void processMessage( String message )
{
// ocorreu uma jogada válida
if ( message.equals("2 jogadores") )
{
m();
System.out.println("entrou");
displayMessage( "Valid move, please wait.\n" );
} // fim do if
else if ( message.equals( "Invalid move, try again" ) )
{
displayMessage( message + "\n" ); // exibe jogada inválida
myTurn = true; // ainda é a vez desse cliente
} // fim de else if
else if ( message.equals( "Opponent moved" ) )
{
int location = input.nextInt(); // obtém a posição da jogada
input.nextLine(); // pula uma nova linha depois da posição de int
displayMessage( "Opponent moved. Your turn.\n" );
myTurn = true; // agora é a vez desse cliente
} // fim de else if
else
displayMessage( message + "\n" ); // exibe a mensagem
} // fim do método processMessage
// manipula outputArea na thread de despacho de eventos
private void displayMessage( final String messageToDisplay )
{
SwingUtilities.invokeLater(
new Runnable()
{
public void run()
{
txtarea.append( messageToDisplay ); // atualiza a saída
} // fim do método run
} // fim da classe inner
); // fim da chamada para SwingUtilities.invokeLater
} // fim do método displayMessage
public static void main( String args[] )
{
JogoCliente application; // declara o aplicativo cliente
// se não houver nenhum argumento de linha de comando
application = new JogoCliente( ); // host local
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
} // fim de main
} // fim da classe TicTacToeClient