Multiplayer (Sockets ou RMI)?

5 respostas
D

Fala aeee!!

olha só…
to querendo aprender a mexer com java em rede…
ja sei programar até q bem java… faço mta coisa…

to querendo fazer um tipo de um joguinho multiplayer… tipo de um Batalha Naval, Jogo da Velha, ou um tipo de ICQ… mas bem simples…

eu pensei em fazer usando banco de dados… pq sei bem usar BD com java… (e ja fiz um tipo de ICQ usando BD num outro serividor)

usando BD eu iria fazer o jogo assim: iria ter 3 computadores em funcionamento durante o jogo… 2 computadores clientes jogando entre si, e mandando os valores das variaveis para o banco de dados no 3º computador… q seria o servidor…

mas o q eu quero é q só as maquinas clientes se comuniquem entre si!

entao a minha duvida é:
como fazer esse joguinho multiplayer sem usar um BD e nem um 3º computador? q o jogo rodasse só entre os computadores dos 2 jogadores??

andei pesquisando e vi q tem q usar isso com sockets né? li algumas coisas e nao sei nao… nao sei se é bem isso q tem q usar… e nem sei como usar…
pensei em usar RMI… seria uma boa opcao?

como poderia programar esse jogo?
é possivel usando só SOCKETS um computador passar valores para outro diretamente por IP sem q haja um outro servidor no caminho?
ou teria q usar RMI? com os objetos remotos???

me deem uma luz sobre SOCKETS e RMI!! :?: :?: :?:

basicamente minha duvida é como fazer 2 computadores clientes manterem contato entre si?

abraços!!
valeu!!!

5 Respostas

F

Cara o conceito é relativamente simples, emas não da para explicar em detálhes aqui, tem uma coisa perfeita para o que vc ta procurando, o Livro Deitel Java como programar v3
http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&ProdTypeId=1&ProdId=186133&ST=SE

lá tem uma grande capitulo do livro que fala de sokets e treads, e tem como exemplo um jogo da velha entre 2 clientes e um chat para várias pessoas.Bom conteúdotabém sobre isso no CoreJava v2 avançado,
http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&ProdTypeId=1&ProdId=156779&ST=SE
muito bom também…Valeu!!

D

alguem poderia me passar um código simples em q 2 maquinas clientes se cominiquem via Sockets?? tipo um P2P de msgs só…

qualquer coisa mandem no meu email ([email removido])… ou postem aki mesmo!

agradeceria mto por uma ajuda!

abraço!

M

daniel, este código é de um aplicativo simples, q envia strings de uma máquina pra outra, são 2 classes, uma cliente, e outra servidor... muito simples:

Server.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Server extends JFrame {

   private JTextField enterField;
   private JTextArea displayArea;
   private ObjectOutputStream output;
   private ObjectInputStream input;
   private ServerSocket server;
   private Socket connection;
   private int counter = 1;
	
   public Server()
   {
      super( "Server" );
		
      Container box = getContentPane();
		
      enterField = new JTextField();
      enterField.setEnabled( false );
		
      enterField.addActionListener(
		
         new ActionListener() {
		
            public void actionPerformed( ActionEvent e )
            {
               sendData( e.getActionCommand() );
               enterField.setText( "" );			
            }
         }
      );
		
      box.add( enterField, BorderLayout.NORTH );
		
      displayArea = new JTextArea();
      JScrollPane scroll = new JScrollPane( displayArea );
      scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
      box.add( scroll, BorderLayout.CENTER );
		
      setSize( 300, 150 );
      setVisible( true );
   }
	
   public void runServer()
   {
      try {
		
         // Etapa 1: cria um ServerSocket
         server = new ServerSocket( 6000, 10 );
			
         while ( true ) {
			
            // Etapa 2: espera uma conexao
            waitForConnection();
				
            // Etapa 3: obtem fluxos de entrada e saida
            getStreams();
				
            // Etapa 4: processa a conexao
            processConnection();
				
            // Etapa 5: fecha a conexao
            closeConnection();
				
            ++counter;
         }
      } 
			
      catch ( EOFException eof )
      {
         System.out.println( "Cliente fechou a conexao" );
      }
			
      catch ( IOException io )
      {
         io.printStackTrace();
      }
   }

   private void waitForConnection() throws IOException
   {
      displayArea.setText( "Esperando pela conexao...\n" );
		
      connection = server.accept();
		
      displayArea.append( "Conexao " + counter + " recebida de: "
+ connection.getInetAddress().getHostName() );
   }
	
   private void getStreams() throws IOException
   {
      output = new ObjectOutputStream( connection.getOutputStream() );
		
      output.flush();

      input = new ObjectInputStream( connection.getInputStream() );
		
      displayArea.append( "\nGot I/O streams\n" );
   }
	
   private void processConnection() throws IOException
   {
      String message = "SERVER> conexao feita";
      output.writeObject( message );
      output.flush();
		
      enterField.setEnabled( true );
		
      do {
		
         try {
			
            message = ( String ) input.readObject();
            displayArea.append( "\n" + message );
            displayArea.setCaretPosition( displayArea.getText().length() );
         }
			
         catch ( ClassNotFoundException classNotFount )
         {
            displayArea.append( "\n**Tipo de objeto recebido desconhecido**" );
         }		
		
      } while ( !message.equals( "CLIENT> exit" ) );
   }

   private void closeConnection() throws IOException
   {
      displayArea.append( "\nUsuario terminou a conexao" );
      enterField.setEnabled( false );
      output.close();
      input.close();
      connection.close();
   }

   private void sendData( String message )
   {
      try {
		
         output.writeObject( "SERVER> " + message );
         output.flush();
         displayArea.append( "\nSERVER> " + message );	
      }		
      catch ( IOException io )
      {
         displayArea.append( "Erro ao escrever a mensagem" );
      }
   }
	
   public static void main( String args[] )
   {
      Server win = new Server();
		
      win.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
      win.runServer();
   }
}
Client.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Client extends JFrame {

   private JTextField enterField;
   private JTextArea displayArea;
   private ObjectOutputStream output;
   private ObjectInputStream input;
   private String message = "";
   private String chatServer;
   private Socket client;
	
   public Client( String host )
   {
      super( "Client" );

      chatServer = host;
		
      Container box = getContentPane();
		
      enterField = new JTextField();
      enterField.setEnabled( false );
		
      enterField.addActionListener(
		
         new ActionListener() {
			
            public void actionPerformed( ActionEvent e )
            {
               sendData( e.getActionCommand() );
               enterField.setText( "" );	
            }
         }		
      );
		
      box.add( enterField, BorderLayout.NORTH );
      
      displayArea = new JTextArea();
      JScrollPane scroll = new JScrollPane( displayArea );
      scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
      box.add( scroll, BorderLayout.CENTER );

      setSize( 300, 150 );
      setVisible( true );
   }
	
   public void runClient()
   {
      try {
		
         // Etapa 1: cria um socket para fazer a conexao
         connectToServer();
			
         // Etapa 2: obtem os fluxos de entrada e saida
         getStreams();
			
         // Etapa 3: processa a conexao
         processConnection();
			
         // Etapa 4: fecha a conexao			
         closeConnection();
      }
      catch ( EOFException eof )
      {
         System.out.println( "O Servidor encerrou a conexao" );
      }		
      catch ( IOException io )
      {
         io.printStackTrace();
      }
   }

   private void getStreams() throws IOException
   {
      output = new ObjectOutputStream( client.getOutputStream() );
      output.flush();
      input = new ObjectInputStream( client.getInputStream() );
		
      displayArea.append( "\nGot I/O streams\n" );
   }

   private void connectToServer() throws IOException
   {
      displayArea.setText( "Fazendo a conexao..." );
		
      client = new Socket( InetAddress.getByName( chatServer ), 6000 );
		
      displayArea.append( "Conectado a: " + client.getInetAddress().getHostName() );
   }

   private void processConnection() throws IOException
   {
      enterField.setEnabled( true );
		
      do {
	
         try {
			
            message = ( String ) input.readObject();
            displayArea.append( "\n" + message );
            displayArea.setCaretPosition( displayArea.getText().length() );
         }		
         catch ( ClassNotFoundException classNotFound )
         {
            displayArea.append( "\n**Tipo de objeto recebido desconhecido**" );
         }	
   
      } while ( !message.equals( "SERVER> exit" ) );
   }

   private void closeConnection() throws IOException
   {
      displayArea.append( "\nFechando conexao" );
      output.close();
      input.close();
      client.close();
   }
	
   private void sendData( String message )
   {
      try {
		
         output.writeObject( "CLIENT> " + message );
         output.flush();
         displayArea.append( "\nCLIENT> " + message );
      }		
      catch ( IOException io )
      {
         displayArea.append( "Erro ao enviar mensagem" );
      }
   }

   public static void main( String[] args )
   {
      String host = JOptionPane.showInputDialog( null, "Digite o host: " );
		
      Client win = new Client( host );
		
      win.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
      win.runClient();
   }

}

Fonte: Java Como Programar, 4ª Edição

D

matheus,
valeu mesmo cara… esse codigo q vc me mandou ta sendo mto ultil!! :stuck_out_tongue: :stuck_out_tongue:

mas no caso de um joguinho multiplayer tipo Jogo da Velha por exemplo, nao iria ter o SERVIDOR… as 2 maquinas seria CLIENTES…

e o q eu queria de verdade, é q 2 maquinas CLIENTES conversassem entre si… tipo joguinho multiplayer por IP mesmo…
existe uma forma de fazer isso?

mas como eu to começando a mexer com SOCKETS, eu queria um programinha CLIENTE q enviaria strings pra esse mesmo programinha, mas q esta sendo executado em outra maquina…
é mto complicado de fazer isso?

valeuuu!!!

H

Mesmo você querendo que seja apenas dois clientes, um dos dois terá que ser o servidor.

Ex.:

Computador 1 - SocketServer & Socket
Computador 2 - Socket

O Computador 1 teria um SocketServer e um Socket.
O SocketServer serve para receber a conexão de um Socket.
O método accept() dele retorna um Socket para se comunicar com o Socket que se conectou a ele.

Criado 11 de março de 2004
Ultima resposta 12 de mar. de 2004
Respostas 5
Participantes 4