Como usar Socket en java..!!

Iniciado por HackerJack, 3 Septiembre 2011, 23:52 PM

0 Miembros y 1 Visitante están viendo este tema.

HackerJack

hola..!! yo soy nuevo en esta pagina web,
tengo una duda sobre java, necesito saber como se utilizan los socket par enviarse informacion entre dos aplicaciones..???? me gustaria que me dieran una idea graxias de antemano..................
::)   :silbar:  ;-)  :laugh:

klaine

#1
El servidor debe instanciar la clase java.net.ServerSocket con el puerto a conectar, de esta instancia obtienes un objeto java.net.Socket con el método accept(), al momento que alguien se conecte,  con el método getOutputStream del Socket obtienes un objeto java.io.ObjectOutputStream, con el cual puedes usar el método writeObject para escribir objectos que recibirá el cliente.

El cliente debe instanciar Socket, deberá recibir como primer argumento la ip del servidor y como segundo argumento el puerto por donde se realizará la conexion, (debe ser el mismo que usa el server)

Para ambos sockets con los método getOutputStream y getInputStream se recibe un objeto ObjectOutputStream y ObjectInputStream respectivamente.

Te dejo un programa ejemplo que se conecta a tu propio pc:

Main: (primero lo ejecutas como server, para esto llamas al metodo s(), luego para instanciar cliente el main llama a c())

Código (java) [Seleccionar]

package sockets;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
import javax.swing.*;

public class Main {

   public static void main(String[] args) {

       
       s(); // la segunda vez que lo ejecutas llama a c();
       
       
   }

   static void s(){

       Server s=new Server();

   }

   static void c(){

       Client c=new Client();

   }

}



Server:

Código (java) [Seleccionar]


package sockets;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
import javax.swing.JOptionPane;

public class Server {

   ServerSocket ss;
   Socket s;
   ObjectOutputStream oos;
   ObjectInputStream ois;

   Server(){

       try {
           ss = new ServerSocket(9999);

                       s = ss.accept();

                       oos=new ObjectOutputStream(s.getOutputStream());

                       oos.writeObject("Hello Socket");

       } catch (IOException ex) {

           close();

       }

       close();

   }

   void close(){
       try {
           s.close();
           ss.close();
       } catch (IOException ex) {

       }

   }

   void read(){

                           try{

       ois=new ObjectInputStream(s.getInputStream());

                   String str=(String) ois.readObject();

                   JOptionPane.showMessageDialog(null, str2, "Server dice:", JOptionPane.INFORMATION_MESSAGE);

                   Thread.sleep(15);

                   }catch(Exception e){
e.printStackTrace();
               }

           }

   }



Cliente:

Código (java) [Seleccionar]


package sockets;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
import java.util.Scanner;
import javax.swing.*;

public class Client {

   Socket s;
   ObjectInputStream ois;
   ObjectOutputStream oos;

   Client(){

       try{

        s=new Socket("localhost", 9999);

       ois=new ObjectInputStream(s.getInputStream());

       String str2=(String) ois.readObject();

       JOptionPane.showMessageDialog(null, str2);

       }catch(IOException ioex){
       
       }catch(ClassNotFoundException ex){

       }


       


   }

}




(Funcionará siempre y cuando no tengas el puerto 9999 ocupado  :xD )

Saludos!

l2ch

una pregunta, ya realizado la conexión del cliente y el servidor, hay alguna manera de que el cliente pueda acceder a los metodos del servidor. o solamente el cliente realiza peticiones mediante flujo de datos?????

Proteus1989

Cita de: l2ch en  9 Febrero 2012, 22:16 PM
una pregunta, ya realizado la conexión del cliente y el servidor, hay alguna manera de que el cliente pueda acceder a los metodos del servidor. o solamente el cliente realiza peticiones mediante flujo de datos?????

Exacto, tu solo le envías información que el servidor interpreta y después de interpretarla te contesta.

Proteus1989

klaine he usado tu código para pruebas y me ha surgido una duda.
¿Qué ocurriría si entran varios clientes a la vez?

Lo he solucionado con un while(socket.getKeepAlive()); pero no se si es lo más eficiente.

Cherry2612

Hola, me parece muy interezante tu código, lo que quice hacer funcionar pero me marca una serie de errores de los cuales no se corregir. Espero me puedas ayudar.
En tu código de Server en la siguiente linea de código no reconoce str2 porque??

JOptionPane.showMessageDialog(null, str2, "Server dice:", JOptionPane.INFORMATION_MESSAGE);

ademas cuando lo quiero ejecutar me marca lo siguiente

Exception in thread "main" java.lang.NullPointerException
   at sockets.Server.close(Server.java:40)
   at sockets.Server.<init>(Server.java:30)
   at sockets.Main.s(Main.java:20)
   at sockets.Main.main(Main.java:13)

reylagarto19

Cita de: l2ch en  9 Febrero 2012, 22:16 PM
una pregunta, ya realizado la conexión del cliente y el servidor, hay alguna manera de que el cliente pueda acceder a los metodos del servidor. o solamente el cliente realiza peticiones mediante flujo de datos?????

aunque ya hace tiempo de este de post, si es cierto que se puede acceder a metodos de uno en otro....

para eso necesitas hecharle un ojo a la libreria CORBA, o montarte un ORB (lo cual me parece muy tedioso...), o si no quieres un ORB, puedes hacerlo de manera mas amigable con un RMI, y te ahorras hacer el Skeleton los proxys.... etc etc...