summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100171.html
blob: 463a90dbfc557283b8994ba87823a7db4c9097ef (plain)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100167.html;106,k100170.html;107,k100172.html;108,k100173.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100167.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100170.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100172.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100173.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 26 - Drucken
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id026004"></a>
<h2>26.4 Zugriff auf serielle und parallele Schnittstellen </h2>
<hr>
<ul>
<li><a href="k100171.html#sectlevel2id026004">26.4 Zugriff auf serielle und parallele Schnittstellen</a>
<ul>
<li><a href="k100171.html#javacommapi">26.4.1 Das Java Communications API</a>
<ul>
<li><a href="k100171.html#sectlevel4id026004001001">Installation</a>
<li><a href="k100171.html#sectlevel4id026004001002">Prinzipielle Arbeitsweise</a>
</ul>
<li><a href="k100171.html#sectlevel3id026004002">26.4.2 Ein einfaches Beispielprogramm</a>
</ul>
</ul>
<hr>

<p>
Sollten die in den vorangegangenen Abschnitten vorgestellten Drucktechniken
nicht funktionieren oder auf Grund praktischer Schwierigkeiten nicht
einsetzbar sein, gibt es eine Reihe anderer M&ouml;glichkeiten, Daten
unter Java auszudrucken. Die aufw&auml;ndigste und flexibelste von
ihnen besteht darin, die Druckdaten selbst aufzubereiten und direkt
an die serielle oder parallele Schnittstelle zu senden, an der der
Drucker angeschlossen ist. Wir wollen in diesem Abschnitt kurz skizzieren,
wie das mit Hilfe des <a name="ixa101735"><i>Java Communications API</i></a>
durchgef&uuml;hrt werden kann. 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Vor Einsatz dieser Technik sollten ihre Nachteile bedacht werden.
Einerseits ist der Aufwand unter Umst&auml;nden sehr gro&szlig;, denn
die Anwendung muss alle Low-Level-Details der Druckeransteuerung selbst
implementieren. Das umfasst die Auswahl und Belegung der Schnittstelle
ebenso wie das Generieren der druckerabh&auml;ngigen Steuersequenzen.
Zweitens ist das Verfahren nicht sonderlich portabel. Zwar gibt es
das Communication API als JDK-Standarderweiterung sowohl f&uuml;r
SOLARIS als auch f&uuml;r Windows, auf anderen Systemen steht es aber
unter Umst&auml;nden nicht zur Verf&uuml;gung. Auch Drucker, die nicht
&uuml;ber die serielle oder paralle Schnittstelle angesteuert werden
(z.B. USB- oder Netzwerkdrucker), k&ouml;nnen auf diese Weise naturgem&auml;&szlig;
nicht angesteuert werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="javacommapi"></a>
<h3>26.4.1 Das Java Communications API </h3>


<!-- Section -->
<a name="sectlevel4id026004001001"></a>
<h4>Installation </h4>

<p>
Das Java Communications API ist eine <i>Standarderweiterung</i> des
JDK und recht einfach zu installieren. Es kann von <a href="http://java.sun.com/products/javacomm/index.html">http://java.sun.com/products/javacomm/index.html</a>
heruntergeladen oder der DVD zum Buch entnommen werden. Bei vorhandener
J2SE 6.0 sieht die Installation wie folgt aus: 
<ul>
<li>Zun&auml;chst ist die Installationsdatei <font color="#660099">javacomm20-win32.zip</font>
in ein separates Verzeichnis zu entpacken.
<li>Nun m&uuml;ssen einige Dateien kopiert werden (wir gehen hier
davon aus, dass das JDK sich im Verzeichnis <font color="#660099">c:\jdk1.6</font>
befindet): 
<ul>
<li><font color="#660099">win32com.dll</font> nach <font color="#660099">c:\jdk1.6\jre\bin</font>
<li><font color="#660099">comm.jar</font> nach <font color="#660099">c:\jdk1.6\jre\lib\ext</font>
<li><font color="#660099">javax.comm.properties</font> nach <font color="#660099">c:\jdk1.6\jre\lib</font>
</ul>
</ul>

<p>
F&uuml;r die J2SE 6.0 ist die Installation des Communications APIs
nun abgeschlossen. Bei einem anderen JDK oder auf einem anderen Betriebssystem
ist unter Umst&auml;nden anders vorzugehen. Weitere Informationen
k&ouml;nnen der Datei <font color="#660099">Readme.html</font> entnommen
werden. 

<!-- Section -->

<a name="sectlevel4id026004001002"></a>
<h4>Prinzipielle Arbeitsweise </h4>

<p>
Das Communications API liegt im Paket <a name="ixa101736"><a href="index_j.html#ixb101341"><font color=#000080><tt>javax.comm</tt></font></a></a>.
Die Klasse <a name="ixa101737"><a href="index_c.html#ixb101342"><font color=#000080><tt>CommPortIdentifier</tt></font></a></a>
dient zur Beschreibung von Kommunikationsports. Sie besitzt eine statische
Methode <a name="ixa101738"><a href="index_g.html#ixb101343"><font color=#000080><tt>getPortIdentifiers</tt></font></a></a>,
mit der eine <a href="index_e.html#ixb100122"><font color=#000080><tt>Enumeration</tt></font></a>
von <a href="index_c.html#ixb101342"><font color=#000080><tt>CommPortIdentifier</tt></font></a>-Objekten
erzeugt werden kann, die ein Element je verf&uuml;gbarem Port enth&auml;lt.
Zus&auml;tzlich kann mit der statischen Methode <a name="ixa101739"><a href="index_g.html#ixb101344"><font color=#000080><tt>getPortIdentifier</tt></font></a></a>
auch direkt auf einen namentlich bekannten Port zugegriffen werden:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public static Enumeration getPortIdentifiers()

public static CommPortIdentifier getPortIdentifier(String portName)
  throws NoSuchPortException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/comm/CommPortIdentifier.html" onClick="this.href=getApiDoc('javax.comm.CommPortIdentifier')"><font color="#660066" size=-1>javax.comm.CommPortIdentifier</font></a></td>
</tr>
</table>

<p>
Wurde ein <a href="index_c.html#ixb101342"><font color=#000080><tt>CommPortIdentifier</tt></font></a>
beschafft, k&ouml;nnen seine Eigenschaften abgefragt werden: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public String getName()

public int getPortType()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/comm/CommPortIdentifier.html" onClick="this.href=getApiDoc('javax.comm.CommPortIdentifier')"><font color="#660066" size=-1>javax.comm.CommPortIdentifier</font></a></td>
</tr>
</table>

<p>
<a name="ixa101740"><a href="index_g.html#ixb100667"><font color=#000080><tt>getName</tt></font></a></a>
liefert den Namen des Ports (z.B. "COM1" oder "LPT1" unter Windows,
"/dev/..." unter UNIX). <a name="ixa101741"><a href="index_g.html#ixb101345"><font color=#000080><tt>getPortType</tt></font></a></a>
gibt entweder <a name="ixa101742"><a href="index_p.html#ixb101346"><font color=#000080><tt>PORT_PARALLEL</tt></font></a></a>
oder <a name="ixa101743"><a href="index_p.html#ixb101347"><font color=#000080><tt>PORT_SERIAL</tt></font></a></a>
zur&uuml;ck, je nachdem, ob es sich um eine parallele oder serielle
Schnittstelle handelt. 

<p>
Soll &uuml;ber einen Port kommuniziert werden, muss sein zugeh&ouml;riger
<a href="index_c.html#ixb101342"><font color=#000080><tt>CommPortIdentifier</tt></font></a>
durch Aufruf von <a name="ixa101744"><a href="index_o.html#ixb101348"><font color=#000080><tt>open</tt></font></a></a>
ge&ouml;ffnet werden: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public synchronized CommPort open(String appname, int timeout)
  throws PortInUseException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/comm/CommPortIdentifier.html" onClick="this.href=getApiDoc('javax.comm.CommPortIdentifier')"><font color="#660066" size=-1>javax.comm.CommPortIdentifier</font></a></td>
</tr>
</table>

<p>
Die beiden Parameter geben den Namen der zu verwendenden Applikation
und die maximale Zeitspanne, die beim &Ouml;ffnen gewartet wird, an.
Der R&uuml;ckgabewert von <a href="index_o.html#ixb101348"><font color=#000080><tt>open</tt></font></a>
ist vom typ <a name="ixa101745"><a href="index_c.html#ixb101349"><font color=#000080><tt>CommPort</tt></font></a></a>
und kann in eine der (daraus abgeleiteten) Klassen <a name="ixa101746"><a href="index_p.html#ixb101350"><font color=#000080><tt>ParallelPort</tt></font></a></a>
oder <a name="ixa101747"><a href="index_s.html#ixb101351"><font color=#000080><tt>SerialPort</tt></font></a></a>
umgewandelt werden. 

<p>
Die wichtigsten Methoden von <a href="index_c.html#ixb101349"><font color=#000080><tt>CommPort</tt></font></a>
sind <a name="ixa101748"><a href="index_g.html#ixb100671"><font color=#000080><tt>getInputStream</tt></font></a></a>
und <a name="ixa101749"><a href="index_g.html#ixb100672"><font color=#000080><tt>getOutputStream</tt></font></a></a>.
Sie beschaffen die zum Lesen bzw. Schreiben von Daten verwendeten
Streams: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public InputStream getInputStream()
  throws IOException

public OutputStream getOutputStream()
  throws IOException
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/javax/comm/CommPort.html" onClick="this.href=getApiDoc('javax.comm.CommPort')"><font color="#660066" size=-1>javax.comm.CommPort</font></a></td>
</tr>
</table>

<p>
Dar&uuml;ber hinaus stellen <a href="index_c.html#ixb101349"><font color=#000080><tt>CommPort</tt></font></a>
und die daraus abgeleiteten Klassen einige Methoden zur Verf&uuml;gung,
mit denen Kommunikationsparameter eingestellt, Puffergr&ouml;&szlig;en
ge&auml;ndert oder Portzust&auml;nde abgefragt werden k&ouml;nnen.
Zudem bieten beide Klassen die M&ouml;glichkeit, Event-Listener zu
registrieren, die bei Zustands&auml;nderungen oder eingehenden Daten
automatisch benachrichtigt werden. Wir wollen auf all diese M&ouml;glichkeiten
nicht weiter eingehen; sie werden in der Dokumentation ausf&uuml;hrlich
beschrieben. 

<!-- Section -->

<a name="sectlevel3id026004002"></a>
<h3>26.4.2 Ein einfaches Beispielprogramm </h3>

<p>
Zum Abschluss dieses Abschnitts soll ein einfaches Beispielprogramm
gezeigt werden, das &uuml;ber die parallele Schnittstelle Daten an
einen Drucker schickt. Es durchsucht zun&auml;chst die Liste aller
Schnittstellen nach einem Parallelport mit dem Namen &#187;LPT1&#171;
(unter UNIX m&uuml;sste dieser Name entsprechend angepasst werden).
Dieser wird ge&ouml;ffnet, und mit <a href="index_g.html#ixb100672"><font color=#000080><tt>getOutputStream</tt></font></a>
ein <a href="index_o.html#ixb100673"><font color=#000080><tt>OutputStream</tt></font></a>
zum Schreiben von Daten beschafft. Nun gibt das Programm f&uuml;nfzig
Zeilen lang Teilstrings von &#187;Hello LPT1 World&#171; aus und sendet
dann das Seitenendezeichen &#187;\f&#171; an den Drucker. Zum Schlu&szlig;
werden Ausgabestream und Port geschlossen und das Programm beendet.
<a name="listingid026004"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/* Listing2604.java */</font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">import</font> java.util.*;
<font color="#555555">004 </font><font color="#0000AA">import</font> java.io.*;
<font color="#555555">005 </font><font color="#0000AA">import</font> javax.comm.*;
<font color="#555555">006 </font>
<font color="#555555">007 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing2604
<font color="#555555">008 </font>{
<font color="#555555">009 </font>  <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> printHello(Writer out)
<font color="#555555">010 </font>  <font color="#0000AA">throws</font> IOException
<font color="#555555">011 </font>  {
<font color="#555555">012 </font>    String s = <font color="#0000FF">"Hello LPT1 World"</font>;
<font color="#555555">013 </font>    s += <font color="#0000FF">" "</font> + s + <font color="#0000FF">" "</font> + s;
<font color="#555555">014 </font>    <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 1; i &lt;= 50; ++i) {
<font color="#555555">015 </font>      out.write(s.substring(0, i) + <font color="#0000FF">"\r\n"</font>);
<font color="#555555">016 </font>    }
<font color="#555555">017 </font>    out.write(<font color="#0000FF">"\f"</font>);
<font color="#555555">018 </font>  }
<font color="#555555">019 </font>
<font color="#555555">020 </font>  <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">021 </font>  {
<font color="#555555">022 </font>    Enumeration en = CommPortIdentifier.getPortIdentifiers();
<font color="#555555">023 </font>    <font color="#0000AA">while</font> (en.hasMoreElements()) {
<font color="#555555">024 </font>      CommPortIdentifier cpi = (CommPortIdentifier)en.nextElement();
<font color="#555555">025 </font>      <font color="#0000AA">if</font> (cpi.getPortType() == CommPortIdentifier.PORT_PARALLEL) {
<font color="#555555">026 </font>        <font color="#0000AA">if</font> (cpi.getName().equals(<font color="#0000FF">"LPT1"</font>)) {
<font color="#555555">027 </font>          <font color="#0000AA">try</font> {
<font color="#555555">028 </font>            ParallelPort lpt1 = (ParallelPort)cpi.open(
<font color="#555555">029 </font>              <font color="#0000FF">"LPT1Test"</font>,
<font color="#555555">030 </font>              1000
<font color="#555555">031 </font>            );
<font color="#555555">032 </font>            OutputStreamWriter out = <font color="#0000AA">new</font> OutputStreamWriter(
<font color="#555555">033 </font>              lpt1.getOutputStream()
<font color="#555555">034 </font>            );
<font color="#555555">035 </font>            printHello(out);
<font color="#555555">036 </font>            out.close();
<font color="#555555">037 </font>            lpt1.close();
<font color="#555555">038 </font>            System.exit(0);
<font color="#555555">039 </font>          } <font color="#0000AA">catch</font> (PortInUseException e) {
<font color="#555555">040 </font>            System.err.println(e.toString());
<font color="#555555">041 </font>            System.exit(1);
<font color="#555555">042 </font>          } <font color="#0000AA">catch</font> (IOException e) {
<font color="#555555">043 </font>            System.err.println(e.toString());
<font color="#555555">044 </font>            System.exit(1);
<font color="#555555">045 </font>          }
<font color="#555555">046 </font>        }
<font color="#555555">047 </font>      }
<font color="#555555">048 </font>    }
<font color="#555555">049 </font>  }
<font color="#555555">050 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/Listing2604.java"><font color="#000055" size=-1>Listing2604.java</font></a></td>
</tr>
</table>
<i>
Listing 26.4: Druckausgabe an LPT1</i></p>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100167.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100170.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100172.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100173.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>