Kapittel 9 Distribusjon Tjenermaskin Fjernbruker LAN Nærbruker WAN Figur 9-1: En enkel klient/tjener distribusjon 195
Tjenermaskin Fjernbruker LAN Replikert tjener Nærbruker WAN Figur 9-2: Klient/tjener-konfigurasjon med replikert tjener 196 Kapittel 9
Tjenerklynge Klienter WAN Figur 9-3: Tjenerklynge Distribusjon 197
A B D C E Figur 9-4: Et peer-to-peer nettverk 198 Kapittel 9
navnetjener. (2) navnetjener.no (3) navnetjener med cache navnetjener.fongen.no (4) (1) Figur 9-5: DNS-oppslag av navnet www.fongen.no Distribusjon 199
sender: operasjon påbegynt mottager: operasjon ikke påbegynt melding Figur 9-6: Mens en melding er underveis er sender og mottager uenige om systemets tilstand 200 Kapittel 9
kl.10:40:56 kl.10:42:23 kompilering TestClass.class 10:40:56 TestClass.java 10:42:23 redigering Figur 9-7: Eksempel på feilsituasjon som følge av unøyaktige klokker. Fordi de to partene bruker sine egne klokker som tidsstempler på filene, later det til at class-filen ikke er ajour. Distribusjon 201
metodekall klient stub melding over nettverket skeleton metodekall tjener Figur 9-8: En RMI-konfigurasjon med stub- og skeleton-objekter 202 Kapittel 9
MOM MOM MOM MOM WAN MOM Figur 9-9: Slik inngår et MOM i en distribuert meldingsflyt Distribusjon 203
Forespørsel Buffer (kø) Buffer (kø) Svar Nettverksprogram Nettverksprogram Figur 9-10: Klient-tjener kommunikasjon via et meldingsgrensesnitt 204 Kapittel 9
import java.net.*; import java.io.*; public class SockClient { Socket s1; BufferedReader br; PrintWriter pw; // Konstruktøren setter opp TCP-forbindelsen public SockClient(String server, int port) throws Exception { s1 = new Socket(server,port); br = new BufferedReader(new InputStreamReader(s1.getInputStream())); pw = new PrintWriter(s1.getOutputStream(),true); // Send en String, vent på svar public String sendmessageandreceivereply (String message) throws Exception { pw.println(message); return br.readline(); // Stenger TCP-forbindelsen public void close() throws Exception { s1.close(); Listing 9-1: Klientside-klasse for en TCP-basert meldingtjeneste Distribusjon 205
import java.net.*; import java.io.*; public class SockServer extends Thread { ServerSocket s1; SockMessageHandler callback; public SockServer(int port,sockmessagehandler cb) throws Exception { s1 = new ServerSocket(port); callback = cb; start(); public void close() throws Exception { s1.close(); public void run() { try { while (true) { Socket s2 = s1.accept(); SockThread st = new SockThread(s2); catch (Exception e) { e.printstacktrace(); class SockThread extends Thread { Socket sock; BufferedReader br; PrintWriter pw; public SockThread(Socket s) throws Exception { sock = s; br = new BufferedReader( new InputStreamReader (s.getinputstream())); pw=new PrintWriter(s.getOutputStream(),true); start(); public void run() { try { while (true) { String message = br.readline(); if (message == null) break; 206 Kapittel 9
InetAddress ip = sock.getinetaddress(); String reply = callback.receive(message,ip); pw.println(reply); sock.close(); catch (Exception e) { Listing 9-2: Tjenerside-klasse for en TCP-basert meldingtjeneste. Legg merke til bruken av flere tråder i utføringen av koden Distribusjon 207
import java.net.inetaddress; public interface SockMessageHandler { public String receive(string message, InetAddress sender); Listing 9-3: Grensesnittet som må implementeres av tjenerkoden 208 Kapittel 9
public class SockMain implements SockMessageHandler { public SockMain() throws Exception { SockServer ss = new SockServer(1958,this); public String receive(string message, java.net.inetaddress sender) { System.out.println("Melding fra: " + sender.gethostaddress()); System.out.println(message); return "Meldingen har " + message.length() + " tegn"; public static void main(string[] args) throws Exception { new SockMain(); Listing 9-4: Tjenerprogram som benytter SockServer-klassen Distribusjon 209
public class SockMainClient { public static void main(string[] args) throws Exception { SockClient sc = new SockClient("localhost",1958); String reply = sc.sendmessageandreceivereply(args[0]); System.out.println("Svaret er: " + reply); Listing 9-5: Klientprogram som bruker SockClient-classen 210 Kapittel 9
Figur 9-11: Skjermbilde fra test med én tjener og to klienter. Merk hvordan meldingene fra to klienter blir flettet i tjeneren. Distribusjon 211
212 Kapittel 9