2012-04-09 17 views
14

En java, es posible crear un servidor de socket y un cliente de socket, ¿es posible tener una instancia del servidor de socket ejecutándose y un socket/servidor cliente que está recibiendo datos del servidor de socket en la misma máquina?¿Es posible ejecutar un servidor de socket y un cliente de socket en la misma máquina?

por ejemplo, el servidor de socket se ejecuta en el puerto 60010 y el cliente de socket se ejecuta en la misma máquina que se conecta a ese puerto a través de un socket o lo necesitaré en una máquina nueva y lo agregaré a mi red? Si tiene una dirección IP única y número de puerto ejecutándose en la capa TCP/IP.

+2

Sí, esto es definitivamente posible. Es fácil de probar y ver por ti mismo. – ulmangt

Respuesta

18

Aquí hay un ejemplo ejecutable simple para comenzar. Inicia dos hilos, uno con un ServerSocket y otro que hace una conexión Socket. Uno continuamente envía cadenas y el otro las imprime.

Simplemente debería poder ejecutar esta clase tal como está.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class SocketTest { 
    public static void main(String[] args) throws IOException { 

     startServer(); 
     startSender(); 
    } 

    public static void startSender() { 
     (new Thread() { 
      @Override 
      public void run() { 
       try { 
        Socket s = new Socket("localhost", 60010); 
        BufferedWriter out = new BufferedWriter(
          new OutputStreamWriter(s.getOutputStream())); 

        while (true) { 
         out.write("Hello World!"); 
         out.newLine(); 
         out.flush(); 

         Thread.sleep(200); 
        } 

       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

    public static void startServer() { 
     (new Thread() { 
      @Override 
      public void run() { 
       ServerSocket ss; 
       try { 
        ss = new ServerSocket(60010); 

        Socket s = ss.accept(); 

        BufferedReader in = new BufferedReader(
          new InputStreamReader(s.getInputStream())); 
        String line = null; 
        while ((line = in.readLine()) != null) { 
         System.out.println(line); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 
+0

Bueno, ¿podría haber un problema si el cliente y el servidor viven en procesos diferentes? – Yola

3

sí, se puede tener la siguiente en la misma máquina:

ServerSocket server = new ServerSocket(60010); 
Socket client = server.accept(); 

En otro lugar:

Socket socket = new Socket("localhost", 60010); 
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println("Hello server"); 
+0

No puede crear 2 sockets en el mismo puerto –

+1

No puede vincular dos sockets de servidor al mismo puerto, pero puede tener varios sockets de cliente que se conectan al mismo puerto (como en un servidor web). –

+0

En un servidor web es un socket de servidor ... De todos modos, si lo dice, creo en usted. Desde mi experiencia, siempre dejo que las tomas de los clientes tengan un número de puerto "aleatorio". –

1

Sí, puede ejecutar un cliente y el servidor en la misma máquina. Lo hago todo el tiempo para el desarrollo. Sin embargo, si tiene problemas, algunos enrutadores tienen problemas para reenviar paquetes a ellos mismos. Intente utilizar localhost en lugar de su IP externa para el desarrollo.

0

Sí, es completamente posible. Cada sistema operativo tiene una interfaz loopback. Puede hacer que varios clientes se conecten a un servidor en su computadora. Este tipo de comunicación tiene lugar en la interfaz de loopback.

Cuestiones relacionadas