Zu den Netzwerkanwendungsmodellen gehören hauptsächlich:
www (World Wide Web) ist ein Informationsbrowsersystem, das auf dem Client/Server-Modell, der HTML-Sprache und dem HTTP-Protokoll basiert und verschiedene Internetdienste bereitstellen kann. Netzwerkinformationen werden an verschiedenen Stellen auf dem Host platziert, und der WWW-Server verwendet Hypertext-Links, um verschiedene Informationen zu verknüpfen. Der WWW-Client (Browser) ist dafür verantwortlich, Kontakt mit dem Server herzustellen, Anfragen an den Server zu senden, HTML-Hypermedien zu verarbeiten, eine grafische Benutzeroberfläche (GUI) bereitzustellen, Informationen anzuzeigen usw.
Seien Sie im Client/Server-Arbeitsmodus auf der Serverseite darauf vorbereitet, Kommunikationen von mehreren Client-Computern zu akzeptieren. Zu diesem Zweck werden neben der Verwendung von IP-Adressen zur Identifizierung von Computern im Internet auch Portnummern zur Identifizierung von Threads eingeführt, die serverseitig Hintergrunddienste bereitstellen. Die Kombination aus Portnummer und IP-Adresse wird als Netzwerk-Socket bezeichnet.
Bei der Implementierung des C/S-Modus in der Java-Sprache werden Sockets in zwei Kategorien unterteilt:
Der Server-Rechner stellt über Ports (Bus-E/A-Adressen) Dienste für den Client-Rechner bereit; der Server-Rechner stellt mehrere verschiedene Dienste gleichzeitig auf seinen verschiedenen Ports bereit. Der Client greift auf einen bestimmten Port des Servers zu und fordert den Server auf, ihn über diesen Port zu bedienen. Vorschriften: Die Portnummern 0 bis 1023 sind für die ausschließliche Verwendung durch das System bestimmt. Beispielsweise befindet sich das HTTP-Protokoll auf Port 80 und das Telnet-Protokoll auf Port 23. Die Ports 1024 bis 65535 werden von Anwendungen verwendet.
Wenn das Client-Programm und das Server-Programm kommunizieren müssen, kann die Socket-Klasse zum Herstellen einer Socket-Verbindung verwendet werden. Stellen Sie sich eine Socket-Verbindung wie einen Telefonanruf vor: Zunächst stellt das Client-Programm den Anruf her, und das Server-Programm hört zu, nachdem der Anruf abgeschlossen ist. Jeder Teilnehmer kann jederzeit sprechen.
Es gibt zwei optionale Möglichkeiten, die Kommunikation zwischen den beiden Parteien zu erreichen: Streaming-Socket und Datagramm-Socket:
Der Streaming-Socket stellt einen Kommunikationskanal zwischen dem Client-Programm und dem Server-Programm her. Jeder Socket kann sowohl Lese- als auch Schreibvorgänge ausführen. Für beide Seiten ist der Kommunikationssitzungsprozess mit der anderen Partei:
Stellen Sie eine Socket-Verbindung her, rufen Sie Eingabe-/Ausgabeströme ab, lesen/schreiben Sie Daten und schließen Sie den Socket (abbauen Sie die Verbindung), nachdem die Kommunikation abgeschlossen ist.
Mit dem Socket-Konstruktor kann clientseitig ein Socket-Objekt zum Server eingerichtet werden:
Socket (String host, int port): Host ist die IP-Adresse des Servers, Port ist die Portnummer, diese sind vorab vereinbart.
Beispielcode:
try{ Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860); }catch(IOException e){}
Verwenden Sie dann die Methode getInputStream(), um den Eingabestream abzurufen, verwenden Sie diesen Eingabestream, um die vom Server in die „Zeile“ eingefügten Informationen zu lesen, verwenden Sie die Methode getOutputStream(), um den Ausgabestream abzurufen, und verwenden Sie diesen Ausgabestream, um Schreiben Sie Informationen in die „Zeile“.
Mit dem ServerSocket-Konstruktor können Sie ein Server-Socket-Objekt auf dem Server erstellen, das Client-Sockets akzeptiert:
ServerSocket(int port): Geben Sie die Portnummer an und erstellen Sie ein ServerSocket-Objekt. Die Portnummer Port muss mit der vom Kunden angerufenen Portnummer übereinstimmen. Verwenden Sie dazu die folgende Codeform:
try{ ServerSocket serverSocket = new ServerSocket(1860); }catch(IOException e){}
Das serverseitige Programm lauscht am angegebenen Port. Wenn es eine Dienstanforderung vom Client-Programm empfängt, erstellt es ein Socket-Objekt, um mit dem Client-Programm zu kommunizieren, das dem Port entspricht. Nach der Ausführung des obigen Codes zum Erstellen eines Server-Socket-Objekts und dem Einrichten des Objekts serverSocket kann es beispielsweise die Methode „accept()“ verwenden, um das Socket-Objekt abzurufen und die Informationen vom Client-Programm vom Socket mySocket zu empfangen. Wie im folgenden Code gezeigt:
try{ Socket sc = serverSocket.accept();//ac ist ein Socket-Objekt}catch(IOException e){}
Um den Dienst zu widerrufen, können Sie das Socket-Objekt sc schließen:
sc.close();
[Beispiel] Clientanwendung im C/S-Modus. Dies ist ein einfaches Beispiel für die clientseitige Streaming-Socket-Kommunikation. Der Code veranschaulicht, wie das clientseitige Programm geschrieben wird. Im Beispiel stellt das Client-Programm eine Anfrage an Port 4441 des Server-Hosts. Nachdem die Verbindung hergestellt wurde, schließt es den Lese- und Schreibvorgang auf dem Server ab.
import java.io.*;import java.net.*;public class Client{ public static void main(String args[]){ String s = null;Socket mySocket;DataOutputStream out = null; = new Socket("localhost",4441); in = new DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("good server!"); if(s==null) break; ); } mySocket.close(); }catch(IOException e){ System.out.println(„Verbindung nicht möglich“);
[Beispiel] Serverseitige Anwendung entsprechend clientseitiger Anwendung. Das Programm lauscht auf Port 4441. Wenn eine Client-Anfrage erkannt wird, wird eine Zeichenfolge mit dem Inhalt „Kunde, hallo, ich bin der Server“ generiert und an den Client ausgegeben.
import java.io.*;import java.net.*;public class Server{ public static void main(String args[]){ ServerSocket server = null;String s = null; DataInputStream in = null; try{ server = new ServerSocket(4441); }catch(IOException e1){ system.out.println("ERROR:" +e1); } try{ you = server.accept(); in = new DataInputStream(you.getInputStream()); while(true){ s = in.readUTF( ); if(s!=null) break; } out.writeUTF("Hallo Kunde, ich bin der Server"); out.close(); e){System.out.println(“ERROR:”+e);} }}
Um die parallele Arbeitsfähigkeit des Computers voll auszunutzen, kann die Socket-Verbindungsarbeit von einem Thread abgeschlossen werden. Wenn der Client den Server auffordert, Dienste bereitzustellen, oder wenn der Server eine Serviceanfrage eines Kunden empfängt, startet er einen Thread, der der Vervollständigung der Informationskommunikation gewidmet ist, erstellt in diesem Thread einen Eingabe- und Ausgabestream und schließt den Informationsaustausch zwischen dem Client und dem Server ab Server.
[Beispiel] Ein Client-Applet, das Socket-Verbindungsarbeiten in einem Thread platziert. Die Benutzeroberfläche verfügt über eine Schaltfläche zum Senden einer Nachricht, ein Textfeld und einen Textbereich. Die Clientanwendung stellt zunächst eine Socket-Verbindung mit dem Server her. Verwenden Sie den Dateneingabestrom, um die vom Server in die Zeile eingegebenen Informationen wiederholt zu lesen und die empfangenen Informationen im Textbereich anzuzeigen. Wenn die abgerufene Information „Ende“ lautet, wird die Socket-Verbindung geschlossen und das Programm beendet. Der Benutzer kann auch Informationen in das Textfeld eingeben und auf die Schaltfläche „Informationen senden“ klicken. Das Client-Programm verwendet dann den Datenausgabestrom, um den Inhalt des Textfelds an den Server zu senden.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public class Aclient erweitert Applet-Implementierungen Runnable,ActionListener{ JTextField textF; JTextArea textA; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); textA = new JTextArea( 20,30); setSize(450,350); JPanel p = new JPanel(); p.add(textF); p.add(button); add(p,"South"); button.addActionListener(this); public void start(){ try{ socket = new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); public void run(){ String s = null; while(true){ try{ s = in.readUTF(}catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Please speak");
[Beispiel] Das Programm verwendet Terminal 4441, um eine Socket-Verbindung mit dem Client herzustellen. Nachdem der Server die Anfrage des Clients empfangen hat, erstellt er einen Thread mit dem Socket des Clients und startet ihn. Wenn keine Kundenanwendung vorhanden ist, überwachen Sie weiterhin die Kundenanwendungen. Der Thread richtet den Eingabedatenstrom ein und den Ausgabedatenstrom entsprechend dem Socket des Clients ein. Der Thread liest mit in die Informationen, die der Kunde in die Zeile einfügt. Wenn die empfangene Information „Ende“ lautet, antwortet der Server mit „Ende“ und schließt dann die Socket-Verbindung; andernfalls antwortet er: „Ich bin der Server, den Sie mir gesagt haben“ und die vom Server empfangenen Informationen.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public class Aclient erweitert Applet-Implementierungen Runnable,ActionListener{ JTextField textF; JTextArea textA; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); textA = new JTextArea( 20,30); setSize(450,350); JPanel p = new JPanel(); p.add(textF); p.add(button); add(p,"South"); button.addActionListener(this); public void start(){ try{ socket = new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); public void run(){ String s = null; while(true){ try{ s = in.readUTF(}catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Please speak"); }catch(IOException e1){} } } }}