Przykłady interfejsu TCP i UDP w Javie W Javie interfejsy TCP i UDP znajdują się w pakiecie java.net http://docs.oracle.com/javase/6/docs/api/java/net/packagesummary.html 1
Przykład interfejsu UDP Protokół UDP (RFC 768) zawodne dostarczanie pojedynczych pakietów. Prosty przykład: klient wysyła jeden pakiet do serwera i czeka na odpowiedź serwer drukuje każdy otrzymany pakiet i odsyła nadawcy klient drukuje otrzymaną odpowiedź i kończy działanie 2
Program klienta DatagramClient.java: import java.net.*; public class DatagramClient { public static void main(string args[]) { try{ /* 1. Wysłanie pakietu... */ InetAddress servaddr = InetAddress.getByName(args[0] byte buf[] = args[1].getbytes( DatagramSocket socket= new DatagramSocket( socket.send( new DatagramPacket( buf, buf.length, servaddr, 4321 // port serwera ) /* 2. Odbiór pakietu... */ buf = new byte[256]; DatagramPacket packet = new DatagramPacket( buf, buf.length socket.receive(packet 3
System.out.println( new String( packet.getdata() ) catch(exception e) { System.err.println(e 4
Program serwera DatagramServer.java: import java.net.*; public class DatagramServer{ public static void main(string args[]){ try{ DatagramSocket socket = new DatagramSocket(4321 while(true){ byte[] buf = new byte[100]; DatagramPacket packet = new DatagramPacket( buf, buf.length /* 1. Oczekujemy na pakiet...*/ socket.receive( packet System.out.println( new String(buf) /* 2. Odsyłamy do nadawcy... */ socket.send( new DatagramPacket( buf, buf.length, packet.getaddress(), packet.getport() ) 5
catch(exception e) { System.err.println(e 6
Kompilacja i uruchomienie: $ javac *.java $ java DatagramServer & # uruchomiony w tle [3] 3330 $ java DatagramClient 127.0.0.1 "Ala ma kota" Ala ma kota Ala ma kota $ java DatagramClient 127.0.0.1 "Ola ma kota" Ola ma kota Ola ma kota $ kill %3 [3]+ Exit 143 java DatagramServer 7
Przykład rozsyłania grupowego: multicast Adresy IP od 224.0.0.0 do 239.255.255.255 są zarezerwowane jako adresy grupowe. Jeden pakiet dostarczany jest do wszystkich odbiorców zapisanych do danej grupy. Program MulticastServer.java: import java.net.*; public class MulticastServer extends Thread{ public static void main(string args[]){ try{ DatagramSocket socket= new DatagramSocket( int counter=0; while(true){ byte[] buf= String.valueOf(counter).getBytes( socket.send( new DatagramPacket( buf, buf.length, InetAddress.getByName( "230.0.0.2" ), 4323 ) sleep(1000 counter++; 8
catch(exception e) { System.err.println(e 9
Program MulticastClient.java: import java.net.*; public class MulticastClient { public static void main(string args[]){ try{ MulticastSocket socket= new MulticastSocket(4323 InetAddress group = InetAddress.getByName("230.0.0.2" /* przyłączamy się do grupy... */ socket.joingroup(group for (int i = 0; i < 5; i++) { byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket( buf, buf.length /* czekamy na kolejny pakiet...*/ socket.receive(packet System.out.println( new String( packet.getdata() ) /* opuszczamy grupę... */ socket.leavegroup(group 10
socket.close( catch(exception e) { System.err.println(e 11
Uruchomienie: $ java MulticastServer & # w tle [3] 3534 $ java MulticastClient 16 17 18 19 20 $ java MulticastClient 24 25 26 27 28 $ kill %3 [3]+ Exit 143 java MulticastServer 12
Przykład interfejsu TCP TCP (RFC 793 i inne...) nezawodne przesyłanie strumienia bajtów. Przykład wielowątkowego serwera, który obsługuje wiele połączeń równocześnie. Program StreamClient.java: import java.net.*; public class StreamClient{ public static void main(string args[]){ try{ Socket socket = new Socket( InetAddress.getByName(args[0]), 4322 int in; while( (in=system.in.read()) >= 0 ) socket.getoutputstream().write( (char) in socket.close( catch(exception e) { System.err.println(e 13
Wątek serwera do obsługi jednego połączenia: Klasa ServerThread.java: import java.net.*; import java.io.*; public class ServerThread extends Thread { Socket mysocket; public ServerThread(Socket socket) // konstruktor { super( // konstruktor klasy Thread mysocket = socket; public void run() // program wątku { try{ int in; /* odbieramy i drukujemy... */ while( ( in= mysocket.getinputstream().read() ) >= 0 ) System.out.print( (char) in mysocket.close( 14
catch(exception e) { System.err.println( e 15
Program serwera StreamServer.java: import java.net.*; public class StreamServer{ public static void main(string args[]){ try{ /* tworzymy socket bez drugiego końca... */ ServerSocket serversocket = new ServerSocket(4322 while(true){ /* czekamy na zgłoszenie klienta... */ Socket socket = serversocket.accept( /* tworzymy wątek dla danego połączenia i uruchamiamy jego program: run()...*/ (new ServerThread(socket)).start( catch(exception e) { System.err.println(e 16
Przykładowe uruchomienie: $ java StreamServer & [3] 3893 $ java StreamClient 127.0.0.1 # EOF: Ctrl+D Ala Ala ma ma Kota Kota $ kill %3 [3]+ Exit 143 java StreamServer Można też uruchomić jeden serwer i jednocześnie wielu klientów w różnych terminalach. 17