2012-04-09 10 views
14

In java è possibile creare un server socket e un client socket, è possibile avere un'istanza del server socket in esecuzione e un client socket/server che sta ricevendo dati dal server socket sulla stessa macchina?È possibile eseguire un server socket e un client socket sulla stessa macchina?

ad esempio il socket server gira sulla porta 60010 e il client del socket è in esecuzione sulla stessa macchina che si connette a quella porta tramite un socket o sarà necessario da una nuova macchina e aggiungerlo alla mia rete? Se ha un indirizzo IP univoco e un numero di porta in esecuzione sul livello TCP/IP.

+2

Sì, questo è sicuramente possibile. È facile provarlo e vedere di persona. – ulmangt

risposta

18

Ecco un semplice esempio eseguibile per iniziare. Inizia due thread, uno con uno ServerSocket e uno che effettua una connessione Socket. Uno invia continuamente stringhe e l'altro le stampa.

Dovresti semplicemente essere in grado di eseguire questa classe così com'è.

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

Beh, potrebbe esserci un problema se client e server vivono in processi diversi? – Yola

3

Sì, si può avere il seguente sulla stessa macchina:

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

Da qualche altra parte:

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

Non è possibile creare 2 socket sulla stessa porta –

+1

Non è possibile associare due socket del server alla stessa porta, ma è possibile avere più socket client che si connettono alla stessa porta (come in un server Web). –

+0

In un server web è una presa server ... Comunque, se lo dici tu, credo in te. Dalla mia esperienza, ho sempre permesso ai socket client di avere un numero di porta "casuale". –

1

Sì, è possibile eseguire un client e un server sulla stessa macchina. Lo faccio tutto il tempo per lo sviluppo. Tuttavia, se si riscontrano problemi, alcuni router hanno problemi ad inoltrare i pacchetti a se stessi. Prova a usare localhost invece del tuo IP esterno per lo sviluppo.

0

Sì, è completamente possibile. Ogni sistema operativo ha un'interfaccia loopback. Puoi avere più client collegati a un server sul tuo computer. Questo tipo di comunicazione avviene tramite l'interfaccia di loopback.