-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClient.java
133 lines (115 loc) · 3.82 KB
/
Client.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* <p>Materialien zu den zentralen
* Abiturpruefungen im Fach Informatik ab 2012 in
* Nordrhein-Westfalen.</p>
* <p>Klasse Client</p>
* Ein Client kann über das Netz die Verbindung zu einem Server herstellen.<br>
* Fehlermeldungen werden ausgegeben.<br>
* Die Eingaben werden nebenläufig verarbeitet.
* <p>NW-Arbeitsgruppe: Materialentwicklung zum Zentralabitur
* im Fach Informatik</p>
*
* @version 2010-10-24
*/
public abstract class Client
{
//Objektbeziehungen
protected Connection hatVerbindung;
private Clientempfaenger hatEmpfaenger;
/**
Hilfsklasse fuer den Client, die in einem eigenen Thread den Empfang einer Nachricht vom Server realisiert.
@author Horst Hildebrecht
@version 1.0 vom 15.06.2006
*/
class Clientempfaenger extends Thread
{
// Objekte
private Client kenntClient;
private Connection kenntVerbindung;
// Attribute
private boolean zVerbindungAktiv;
/**
Der ClientEmpfaenger hat den zugehörigen Client und die zugehörige Connection kennen gelernt.<br>
@param pClient zugehöriger Client, der die einkommenden Nachrichten bearbeitet
@param pConnection zugehörige Connection, die die einkommenden Nachrichten empfängt
*/
public Clientempfaenger(Client pClient, Connection pConnection)
{
kenntClient = pClient;
kenntVerbindung = pConnection;
zVerbindungAktiv = true;
}
/**
*Solange der Server Nachrichten sendete, wurden diese empfangen und an die ClientVerbinedung weitergereicht.
*/
public void run()
{
String lNachricht;
boolean lNachrichtEmpfangen = true;
do
if (zVerbindungAktiv)
{
lNachricht = kenntVerbindung.receive();
lNachrichtEmpfangen = (lNachricht != null);
if (lNachrichtEmpfangen)
kenntClient.processMessage(lNachricht);
}
while (zVerbindungAktiv && lNachrichtEmpfangen);
}
/**
*Der ClientEmpfaenger arbeitet nicht mehr
*/
public void gibFrei()
{
zVerbindungAktiv = false;
}
}
/**
*Der Client ist mit Ein- und Ausgabestreams initialisiert.<br>
*@param pIPAdresse IP-Adresse bzw. Domain des Servers
*@param pPortNr Portnummer des Sockets
*/
public Client(String pIPAdresse, int pPortNr)
{
hatVerbindung = new Connection(pIPAdresse, pPortNr);
try
{
hatEmpfaenger = new Clientempfaenger(this, hatVerbindung);
hatEmpfaenger.start();
}
catch (Exception pFehler)
{
System.err.println("Fehler beim Öffnen des Clients: " + pFehler);
}
}
public void send(String pMessage)
{
hatVerbindung.send(pMessage);
}
public boolean istVerbunden()
{ if (hatEmpfaenger != null)
return hatEmpfaenger.zVerbindungAktiv;
else
return false;
}
public String toString()
{
return "Verbindung mit Socket: " + hatVerbindung.verbindungsSocket();
}
/**
* Eine Nachricht vom Server wurde bearbeitet.<br>
* Diese abstrakte Methode muss in Unterklassen überschrieben werden.
* @param pMessage die empfangene Nachricht, die bearbeitet werden soll
*/
public abstract void processMessage(String pMessage);
/**
* Die Verbindung wurde mit Ein- und Ausgabestreams geschlossen.
*/
public void close()
{
if (hatEmpfaenger != null)
hatEmpfaenger.gibFrei();
hatEmpfaenger = null;
hatVerbindung.close();
}
}