2012-04-09 10 views
14

W java można utworzyć serwer gniazd i klienta gniazda, czy możliwe jest uruchomienie instancji serwera gniazd i klient gniazda/serwera, który odbiera dane z serwera gniazd na tym samym komputerze?Czy jest możliwe uruchomienie serwera gniazd i klienta gniazda na tym samym komputerze?

np. Serwer gniazda działa na porcie 60010 , a klient gniazda działa na tym samym komputerze, który łączy się z tym portem przez gniazdo, czy też potrzebuje nowego komputera i doda go do mojej sieci? Jeśli ma unikalny adres IP i numer portu działający na warstwie TCP/IP.

+2

Tak, to zdecydowanie możliwe. Łatwo go wypróbować i przekonać się samemu. – ulmangt

Odpowiedz

18

Oto prosty, działający przykład, który pomoże Ci zacząć. Zaczyna dwa wątki, jeden z ServerSocket i jeden, który tworzy połączenie Socket. Ciągle wysyła ciągi, a drugi je drukuje.

Powinieneś po prostu być w stanie uruchomić tę klasę tak jak jest.

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

Cóż, czy może istnieć problem, jeśli klient i serwer działają w różnych procesach? – Yola

3

Tak, można mieć następujące na tej samej maszynie:

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

Gdzieś indziej:

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

Nie można utworzyć 2 gniazd na tym samym porcie. –

+1

Nie można powiązać dwóch gniazd serwerów z tym samym portem, ale można mieć wiele gniazd klientów łączących się z tym samym portem (jak na serwerze WWW). –

+0

W serwerze internetowym jest to gniazdo Serwera ... W każdym razie, jeśli tak mówisz, to wierzę w ciebie. Z mojego doświadczenia wynika, że ​​zawsze pozwalam gniazdom klienta mieć "losowy" numer portu. –

1

Tak, można uruchomić klienta i serwera na tej samej maszynie. Robię to cały czas na rozwój. Jeśli masz kłopoty, niektóre routery mają problemy z przekazywaniem pakietów do siebie. Spróbuj użyć lokalnego hosta zamiast zewnętrznego adresu IP do rozwoju.

0

Tak, jest to całkowicie możliwe. Każdy system operacyjny ma interfejs loopback. Możesz połączyć wielu klientów z jednym serwerem na twoim komputerze. Ten rodzaj komunikacji odbywa się za pośrednictwem interfejsu pętli zwrotnej.