26.09.2018, 09:45 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: Knoppix Forum | www.KnoppixForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Beiträge: 711

Geschlecht: Männlich

1

06.01.2011, 17:25

Alphatester für Client-/Server-Musikbox gesucht.

Hi,

meine Musikbox ist jetzt so weit, dass ich jemanden bräuchte, der sie mal testet.

Es handelt sich um ein Java-Programm, das *.ogg-Dateien quasi-synchron auf mehreren PC's abspielt.
Mit quasi-synchron ist gemeint, dass die Synchronität von der lokalen Netzwerkauslastung abhängt. Wenn Onboard-Sound benutzt wird, kann das ebenfalls zu asynchronität führen, da die Lieder ggf. unterschiedlich schnell abgespielt werden.

Test-Voraussetzungen:
- mindestens zwei PC's mit Soundkarte in einem lokalen Netz müssen vorhanden sein.
- die Musikdateien müssen (nur) auf dem PC vorhanden sein, wo das Programm als Server gestartet wird.
- es muss mindestens eine Textdatei existieren, in die (jeweils) bis zu 2600 Titel incl. Pfad aufgenommen sind. Ein Programm zum Erstellen einer solchen Datei wird mitgeliefert.

Die Auslieferung erfolgt als komplettes Knoppix-Image der 6.4.3. Das ist auch der Grund, weshalb ich mich hier an das Knoppix-Forum wende.
Zu dem Image gibt es jeweils Updates als tar-Datei. Dort findet ihr einen Ordner source, dessen Inhalt einfach jeweils komplett über / kopiert wird. Dann seid ihr wieder aktuell.

Nach dem Start von Knoppix findet ihr auf dem Desktop Icons zum Starten des Serverprogramms, des Clientprogramms bzw. des Programms zur Listenerstellung.
Server und Client können natürlich nicht auf demselben PC laufen, da der ja nur einen Musikausgang hat.

Wenn sich jemand meldet, der Lust dazu hat, das zu testen, dann werde ich ihm/ihr die Downloads per PN mitteilen. Damit möchte ich verhindern, dass sich instabile alpha-Versionen verteilen.
MfG. Cottonwood.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cottonwood« (06.01.2011, 18:32)


Beiträge: 1 150

Geschlecht: Männlich

2

06.01.2011, 17:37

Würde ich machen, jedoch habe ich nur einen Rechner mit CD-Laufwerk, der andere hat keines.
Ich würde dir eine isolinux.bin schicken, die Du bitte anstelle der original in das Remaster einbindest.
Danach kann das Ding mithilfe von isohybrid für einen USB-Stick vorbereitet werden, auf den das ganze iso einfach nur noch mit dd kopiert werden muss.
Wäre das OK?

Beiträge: 711

Geschlecht: Männlich

3

06.01.2011, 18:26

@Thread: Zwischendurch habe ich Maxi den Download-Link mitgeteilt.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

4

06.01.2011, 22:24

Also:
Ich habe das ISO zwar noch nicht fertig heruntergeladen, jedoch habe ich das Programm schon auf meinem Archlinux durch das installieren von JMF zum laufen gebracht.
Soweit funktioniert das bestens...
Ich würde jedoch die Startskripte abändern:
start_Juke2010c

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#
# MusicPlayerClient
#

declare -x SLICKHOME="/usr/share/lwjgl"
declare -x JMFHOME="/home/knoppix/JMF-2.1.1e"
declare -x CLASSPATH="\
${SLICKHOME}/jar/lwjgl.jar:\
${SLICKHOME}/slick/lib/ibxm.jar:\
${SLICKHOME}/slick/lib/jogg-0.0.7.jar:\
${SLICKHOME}/slick/lib/jorbis-0.0.15.jar:\
${SLICKHOME}/slick/lib/slick-util.jar:\
${JMFHOME}/jmf.jar:.:"
echo $CLASSPATH
java -Djava.library.path="${SLICKHOME}/native/linux" MusicPlayerClient
echo "Program terminated. sleep 120 follows to keep this window open"
sleep 120
start_Juke2010

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
#
# Juke2010 filename_of_the_titles_file
#
# Here you can find a sample file: /usr/share/lwjgl/Musiktitel.txt

declare -x SLICKHOME="/usr/share/lwjgl"
declare -x JMFHOME="/home/knoppix/JMF-2.1.1e"
declare -x CLASSPATH="\
${SLICKHOME}/jar/lwjgl.jar:\
${SLICKHOME}/slick/lib/ibxm.jar:\
${SLICKHOME}/slick/lib/jogg-0.0.7.jar:\
${SLICKHOME}/slick/lib/jorbis-0.0.15.jar:\
${SLICKHOME}/slick/lib/slick-util.jar:\
${JMFHOME}/jmf.jar:.:"
echo $CLASSPATH
java -Djava.library.path="${SLICKHOME}/native/linux" Juke2010 /media/sda2/Musik/titles.txt
echo "Program terminated. sleep 120 follows to keep this window open"
sleep 120

Beiträge: 711

Geschlecht: Männlich

5

06.01.2011, 22:31

Danke für den Tipp. Das sleep 120 ist auch etwas lang. Ein sleep 30 reicht sicher, um eventuelle Fehlermeldungen zu sehen.

Also:
Ich habe das ISO zwar noch nicht fertig heruntergeladen, jedoch habe ich das Programm schon auf meinem Archlinux durch das installieren von JMF zum laufen gebracht.
Soweit funktioniert das bestens...


Ich war mir nicht sicher, ob du das einfach in deine Umgebung reinklatschen kannst. Schliesslich sind da veränderte Systemdateien drinnen, die bei dir auch schon angepasst worden sein könnten.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

6

06.01.2011, 22:44

Zitat

Ich war mir nicht sicher, ob du das einfach in deine Umgebung reinklatschen kannst. Schliesslich sind da veränderte Systemdateien drinnen, die bei dir auch schon angepasst worden sein könnten.
Ich habe das nicht einfach reingeklatscht.
Ich habe die Startsktipte halt so angepasst,dass SLICKHOME und JMFHOME jeweils auf das /home/maximilian/Downloads/Remaster 6.4.3/source/usr/share/lwjgl und /opt/java/jre/lib/ext zeigt.
Die entsprechen eben diesen Verzeichnissen in meiner Umgebung und schon geht es.

Beiträge: 1 150

Geschlecht: Männlich

7

07.01.2011, 11:07

Feedback

Prinzipiell finde ich die Software gut, jedoch hat Sie noch ein paar Krankheiten:
  • Musik läuft nicht schön syncron.
    Lösungsvorschlag:
    Alles Rechner über z.B. ntp auf die gleiche Uhrzeit bringen und dann Pakete mit der Uhrzeit und des Spielstandes vom Server schicken:

    Quellcode

    1
    
    11:00:02:43,234/2:30
    Nun kann der Client die Latenz einrechnen und so die Spielzeit korrigieren.
  • Die Oberfläche ist nicht gerade die beste.
    • Ich mag kein maximiertes Serverfenster, welches ich nicht verkleinern kann.
    • Statusanzeige wäre nett.
    • Anzeige verbundener Clients.
  • Es können sich, zumindest bei mir keine Clients zur Laufzeit verbinden.
Ansonsten ist die Software aber gut gelungen.

Beiträge: 711

Geschlecht: Männlich

8

07.01.2011, 11:50

Musik läuft nicht schön syncron.
Lösungsvorschlag:
Alls Rechner über z.B. ntp auf die gleiche Uhrzeit bringen und dann Pakete mit der Uhrzeit und des Spielstandes vom Server schicken:

Quellcode

1
11:00:02:43,234/2:30
Nun kann der Client die Latenz einrechnen und so die Spielzeit korrigieren.

Gute Idee. ntp kannte ich noch nicht. Ist halt mein erstes Java-Programm und mein erstes Client-/Server-Programm. Und Synchronität ist hier sehr wichtig.

Die Oberfläche ist nicht gerade die beste.
  • Ich mag kein maximiertes Serverfenster, welches ich nicht verkleinern kann.
  • Statusanzeige wäre nett.
  • Anzeige verbundener Clients.


Die Oberfläche ist insgesamt noch ein Thema. Auch hier bin ich halt noch Anfänger. Das alles steht allerdings hinten auf meiner Liste. Funktionalität geht für mich erst einmal vor. Ich werde aber alle Punkte abarbeiten. Insbesondere muss ich mich weiter in Swing einarbeiten. Dazu werde ich nach Abschluss der funktionalen Dinge das Buch Java ist auch eine Insel weiter durcharbeiten.
@alle: Es wäre schön, wenn ich ein Beispiel für ein Swing-Fenster-Programm haben könnte, das eine dynamische, veränderbare Liste enthält.

Es können sich, zumindest bei mir keine Clients zur Laufzeit verbinden.

Sollten sie aber. Das Problem liegt allerdings darin, dass die Lieder vor dem Abspielen übertragen werden. Wenn du also nur zwei Lieder eingibst, passiert folgendes: Das 1. Lied wird übertragen (kein Empfänger), dann gestartet. Während es spielt, wird das 2. Lied übertragen. Jetzt meldest du dich als Client an. Der Client wartet natürlich auf den nächsten Liedanfang. Da das 2. Lied aber zumindest teilweise schon übertragen wurde, muss der Client auf das 3. Lied warten. Das sollte dann aber wieder (quasi-) synchron laufen.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

9

07.01.2011, 12:34

Zitat

Funktionalität geht für mich erst einmal vor.
Für mich auch, aber bitte, wenn Du es irgendwie hinbekommst, dass das Fenster nicht maximiert ist, das ist das wichtigste.
Es braucht nicht in der Größe veränderlich sein, eine fixe Größe von 800x600 zum Beispiel, im Moment schiebt sich das halt vor alles andere und ich kann das Debugging-Bash-Fenster nicht daneben positionieren.

Zitat

Sollten sie aber. Das Problem liegt allerdings darin, dass die Lieder vor dem Abspielen übertragen werden. Wenn du also nur zwei Lieder eingibst, passiert folgendes: Das 1. Lied wird übertragen (kein Empfänger), dann gestartet. Während es spielt, wird das 2. Lied übertragen. Jetzt meldest du dich als Client an. Der Client wartet natürlich auf den nächsten Liedanfang. Da das 2. Lied aber zumindest teilweise schon übertragen wurde, muss der Client auf das 3. Lied warten. Das sollte dann aber wieder (quasi-) synchron laufen.
Ah, ok, wusste ich nicht, dachte der fängt dann einfach an zu dudeln.

Ich habe jetzt noch eine Eigenart bemerkt, der Server hängt dem Client um etwas weniger als eine Minute hinterher, beim 1. Lied.
Die Synchronizität wird mit dem 2. Lied besser und die waren sogar fast gleichzeitig, jedoch hat der Client dann einen Hänger gehabt und hängt nun 1 Sekunde oder so hintendran.
Es gab auch eine Fehlermeldung (nur Client): "Corrupt or missing data in bitstream; continuing..." beim Hänger.
Dazu noch eine kleine Anmerkung, einen Error zu werfen und dann ein "continuing..." zu schreiben passt irgendwie nicht, ich denke, da wäre warn besser geeignet.

Beiträge: 711

Geschlecht: Männlich

10

07.01.2011, 16:49

Zitat

Funktionalität geht für mich erst einmal vor.
Für mich auch, aber bitte, wenn Du es irgendwie hinbekommst, dass das Fenster nicht maximiert ist, das ist das wichtigste.
Es braucht nicht in der Größe veränderlich sein, eine fixe Größe von 800x600 zum Beispiel, im Moment schiebt sich das halt vor alles andere und ich kann das Debugging-Bash-Fenster nicht daneben positionieren.

Ich habe dir die Source per PN geschickt. Kannst du dir die Größe selber einstellen?

Ich habe jetzt noch eine Eigenart bemerkt, der Server hängt dem Client um etwas weniger als eine Minute hinterher, beim 1. Lied.

Wenn er sich um mehr als 15 Sekunden auseinander bewegt, müsste der Client eigentlich Probleme mit dem folgenden Lied bekommen. Wird das 1. Lied dann auf dem Client am Ende abgeschnitten, bevor das 2. anfängt?

Die Synchronizität wird mit dem 2. Lied besser und die waren sogar fast gleichzeitig, jedoch hat der Client dann einen Hänger gehabt und hängt nun 1 Sekunde oder so hintendran.

Das müsste sich aber beim nächsten Liedanfang wieder synchronisieren.

Es gab auch eine Fehlermeldung (nur Client): "Corrupt or missing data in bitstream; continuing..." beim Hänger.

Wenn das nur im Client passiert, dann würde mich interessieren, ob die Client-Datei temporary.ogg vom Inhalt her identisch ist mit dem gesendeten Lied (Server) oder nicht.


Dazu noch eine kleine Anmerkung, einen Error zu werfen und dann ein "continuing..." zu schreiben passt irgendwie nicht, ich denke, da wäre warn besser geeignet.

Das passiert leider in den tiefen Abgründen der lwjgl-Software. Da habe ich keinen Einfluss drauf.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

11

07.01.2011, 20:28

Zitat

Ich habe dir die Source per PN geschickt. Kannst du dir die Größe selber einstellen?
Wenn Du mir verrätst wie der Dateiname der Datei ist, könnte ich es mal versuchen.

Zitat

Wenn er sich um mehr als 15 Sekunden auseinander bewegt, müsste der Client eigentlich Probleme mit dem folgenden Lied bekommen. Wird das 1. Lied dann auf dem Client am Ende abgeschnitten, bevor das 2. anfängt?
Nein, funktioniert bestens.

Zitat

Das müsste sich aber beim nächsten Liedanfang wieder synchronisieren.
Ja, tut es auch.

Zitat

Wenn das nur im Client passiert, dann würde mich interessieren, ob die Client-Datei temporary.ogg vom Inhalt her identisch ist mit dem gesendeten Lied (Server) oder nicht.
Werde es mal mit Prüfsummen überprüfen.

Zitat

Das passiert leider in den tiefen Abgründen der lwjgl-Software. Da habe ich keinen Einfluss drauf.
Gut, wollte es nur mal sagen.

Beiträge: 711

Geschlecht: Männlich

12

07.01.2011, 20:57

Musik läuft nicht schön syncron.
Lösungsvorschlag:
Alls Rechner über z.B. ntp auf die gleiche Uhrzeit bringen und dann Pakete mit der Uhrzeit und des Spielstandes vom Server schicken:

Quellcode

1
11:00:02:43,234/2:30
Nun kann der Client die Latenz einrechnen und so die Spielzeit korrigieren.

Gute Idee. ntp kannte ich noch nicht. Ist halt mein erstes Java-Programm und mein erstes Client-/Server-Programm. Und Synchronität ist hier sehr wichtig.

Leider scheint Java die Uhrzeit nicht verstellen zu können. Aber zur Not fällt mir da auch eine quad-Lösung ein (quad=quick and dirty).


Zitat

Ich habe dir die Source per PN geschickt. Kannst du dir die Größe selber einstellen?
Wenn Du mir verrätst wie der Dateiname der Datei ist, könnte ich es mal versuchen.

TastaturInput.java Sorry. Bei Java steht der Dateiname immer in der 1. Zeile, in der das Wort Class vorkommt, direkt hinter dem Leerzeichen nach Class. Man muss dann einfach .java anhängen.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

13

07.01.2011, 21:07

Habe es nun abgeändert, vielleicht solltest Du es übernehmen.
Einfach Folgendes (hoffe Du hast nichts gegen die eine Zeile öffentlichen Sourcecodes):

Quellcode

1
f.setSize(e.getMaximumWindowBounds().width / 2,e.getMaximumWindowBounds().height / 2);
Damit passt es sich auf jeden Rechner an und sieht gut aus.

Beiträge: 711

Geschlecht: Männlich

14

07.01.2011, 21:13

Ich habe es mal auf 970x600 gesetzt. Bevor du dir die ganze Entwicklungsumgebung installierst...
»Cottonwood« hat folgende Datei angehängt:
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

15

07.01.2011, 21:19

Zitat

Bevor du dir die ganze Entwicklungsumgebung installierst...
Die ist schon drauf und funktioniert auch bestens.
Habe nun mal den Prüfsummen-Vergleich gemacht, sie sind unterschiedlich.
/* Edit: Ich merke gerade, dass es nun auch in der Größe veränderlich ist. */

Beiträge: 711

Geschlecht: Männlich

16

08.01.2011, 22:30

Ich habe mich jetzt zwei Tage mit ntpd auseinander gesetzt. Ein Beispielprogramm hat mir gezeigt, dass das Aktualisieren der Uhrzeit nicht der richtige Weg ist:

Quellcode

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
/*
 * Copyright 2001-2005 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.apache.commons.net.ntp.*;
/***
 * This is an example program demonstrating how to use the NTPUDPClient
 * class. This program sends a Datagram client request packet to a
 * Network time Protocol (NTP) service port on a specified server,
 * retrieves the time, and prints it to standard output along with
 * the fields from the NTP message header (e.g. stratum level, reference id,
 * poll interval, root delay, mode, ...)
 * See <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc868.txt"> the spec </A>
 * for details.
 * <p>
 * Usage: NTPClient <hostname-or-address-list>
 * <br>
 * Example: NTPClient clock.psu.edu
 *
 * @author Jason Mathews, MITRE Corp
 ***/
public final class NTPClient
{
	private static final NumberFormat numberFormat = new
	java.text.DecimalFormat("0.00");
	/**
	 * Process <code>TimeInfo</code> object and print its details.
	 * @param info <code>TimeInfo</code> object.
	 */
// Start modification (return value added: void->long)
	public static long processResponse(TimeInfo info)
// End modification
	{
		NtpV3Packet message = info.getMessage();
		int stratum = message.getStratum();
		String refType;
		if (stratum <= 0)
			refType = "(Unspecified or Unavailable)";
		else if (stratum == 1)
			refType = "(Primary Reference; e.g., GPS)"; // GPS, radio clock, etc.
		else
			refType = "(Secondary Reference; e.g. via NTP or SNTP)";
		// stratum should be 0..15...
		System.out.println(" Stratum: " + stratum + " " + refType);
		int version = message.getVersion();
		int li = message.getLeapIndicator();
		System.out.println(" leap=" + li + ", version="
				+ version + ", precision=" + message.getPrecision());
		System.out.println(" mode: " + message.getModeName()
				+ " (" + message.getMode() + ")");
		int poll = message.getPoll();
		// poll value typically btwn MINPOLL (4) and MAXPOLL (14)
		System.out.println(" poll: " + (poll <= 0 ? 1 : (int) Math.pow(2, poll))
				+ " seconds" + " (2 ** " + poll + ")");
		double disp = message.getRootDispersionInMillisDouble();
		System.out.println(" rootdelay="
				+ numberFormat.format(message.getRootDelayInMillisDouble())
				+ ", rootdispersion(ms): " + numberFormat.format(disp));
		int refId = message.getReferenceId();
		String refAddr = NtpUtils.getHostAddress(refId);
		String refName = null;
		if (refId != 0) {
			if (refAddr.equals("127.127.1.0")) {
				refName = "LOCAL"; // This is the ref address for the Local Clock
			} else if (stratum >= 2) {
				//If reference id has 127.127 prefix then it uses its own reference clock
				//defined in the form 127.127.clock-type.unit-num (e.g. 127.127.8.0 mode 5
				//for GENERIC DCF77 AM; see refclock.htm from the NTP software distribution.
				if (!refAddr.startsWith("127.127")) {
					try {
						InetAddress addr = InetAddress.getByName(refAddr);
						String name = addr.getHostName();
						if (name != null && !name.equals(refAddr))
							refName = name;
					} catch (UnknownHostException e) {
						// some stratum-2 servers sync to ref clock device but fudge
						// stratum level higher... (e.g. 2)
						// ref not valid host maybe it's a reference clock name?
						// otherwise just show the ref IP address.
						refName = NtpUtils.getReferenceClock(message);
					}
				}
			} else if (version >= 3 && (stratum == 0 || stratum == 1)) {
				refName = NtpUtils.getReferenceClock(message);
				//refname usually have at least 3 characters (e.g. GPS, WWV, LCL, etc.)
			}
			//otherwise give up on naming the beast...
		}
		if (refName != null && refName.length() > 1)
			refAddr += " (" + refName + ")";
		System.out.println(" Reference Identifier:\t" + refAddr);
		TimeStamp refNtpTime = message.getReferenceTimeStamp();
		System.out.println(" Reference Timestamp:\t" + refNtpTime + " "
				+ refNtpTime.toDateString());
		// Originate Time is time request sent by client (t1)
		TimeStamp origNtpTime = message.getOriginateTimeStamp();
		System.out.println(" Originate Timestamp:\t" + origNtpTime + " "
				+ origNtpTime.toDateString());
		long destTime = info.getReturnTime();
		// Receive Time is time request received by server (t2)
		TimeStamp rcvNtpTime = message.getReceiveTimeStamp();
		System.out.println(" Receive Timestamp:\t" + rcvNtpTime + " "
				+ rcvNtpTime.toDateString());
		// Transmit time is time reply sent by server (t3)
		TimeStamp xmitNtpTime = message.getTransmitTimeStamp();
		System.out.println(" Transmit Timestamp:\t" + xmitNtpTime + " "
				+ xmitNtpTime.toDateString());
		// Destination time is time reply received by client (t4)
		TimeStamp destNtpTime = TimeStamp.getNtpTime(destTime);
		System.out.println(" Destination Timestamp:\t" + destNtpTime + " "
				+ destNtpTime.toDateString());
		info.computeDetails(); // compute offset/delay if not already done
		Long offsetValue = info.getOffset();
		Long delayValue = info.getDelay();
		String delay = (delayValue == null) ? "N/A" : delayValue.toString();
		String offset = (offsetValue == null) ? "N/A" : offsetValue.toString();
		System.out.println(" Roundtrip delay(ms)=" + delay
				+ ", clock offset(ms)=" + offset); // offset in ms
// Start modification (return value added)
		return offsetValue;
// End modification
	}
	public static final void main(String[] args)
	{
		if (args == null || args.length == 0) {
			System.err.println("Usage: NTPClient <hostname-or-address-list>");
			System.exit(1);
		}
		NTPUDPClient client = new NTPUDPClient();
		// We want to timeout if a response takes longer than 10 seconds
		client.setDefaultTimeout(10000);
		long offsetValue = 0;
		try {
			client.open(NtpV3Packet.NTP_PORT);
			for (int i = 0; i < args.length; i++)
			{
				System.out.println();
				try {
					InetAddress hostAddr = InetAddress.getByName(args[i]);
					System.out.println("> " + hostAddr.getHostName() + "/" +
							hostAddr.getHostAddress());
					TimeInfo info = client.getTime(hostAddr);
// Start modification (return value added)
					offsetValue=processResponse(info);
// End modification
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
// Start modification (following part is completely added)		
        Runtime rt = Runtime.getRuntime();
        GregorianCalendar cal = new GregorianCalendar();
        try {
            long MillisNeu = System.currentTimeMillis();
            MillisNeu = MillisNeu - offsetValue;
            cal.setTimeInMillis(MillisNeu);
            rt.exec("cmd.exe /C time " + cal.get(Calendar.HOUR_OF_DAY) + "." + cal.get(Calendar.MINUTE) + "." + cal.get(Calendar.SECOND) + "." + cal.get(Calendar.MILLISECOND) / 10);
        }
        catch(IOException ex) {
			ex.printStackTrace();
            System.exit(-1);
        }
// End modification
		client.close();
	}
}


Ich kann die Uhrzeit sowieso mit Java nicht setzen. Also muss ich mich auch nicht davon abhängig machen, dass eine Internetverbindung besteht. Ausserdem bin ich von Servern abhängig, deren Leben oder Überleben ich nicht für längere Zeit voraussagen kann. Das wiederum würde nachträglichen Anpassungsaufwand für alle Installationen nach sich ziehen. Die daraus resultierenden Flüche möchte ich mir nicht anhören müssen.

Man mag sowas benutzen, um die Uhrzeit auf dem PC zu stellen. Aber man sollte keine weitergehende Software davon abhängig machen.

Ich verfolge nun den Weg, dass die Zeit des Serverprogramms die ausschlaggebende Zeit für alle Clients sein sollte. Die Clients sollen sich aber nicht auf die Serverzeit umstellen müssen. Das geht halt mit Java so nicht. Es reicht aber auch vollständig aus, wenn sie die Zeitdifferenz kennen.

Auf dieser Basis werde ich jetzt eine Lösung erarbeiten. Das wird aber noch etwas Zeit in Anspruch nehmen.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

17

09.01.2011, 01:50

Zitat

Ich kann die Uhrzeit sowieso mit Java nicht setzen. Also muss ich mich auch nicht davon abhängig machen, dass eine Internetverbindung besteht. Ausserdem bin ich von Servern abhängig, deren Leben oder Überleben ich nicht für längere Zeit voraussagen kann. Das wiederum würde nachträglichen Anpassungsaufwand für alle Installationen nach sich ziehen. Die daraus resultierenden Flüche möchte ich mir nicht anhören müssen.
Ich würde das einfach dem Nutzer überlassen (war auch ursprünglich so gemeint).
Und wenn die Uhrzeit nicht synchron ist: It's not a bug it's a feature - Falls man die Titel asynchron abspielen möchte.

Beiträge: 711

Geschlecht: Männlich

18

09.01.2011, 02:33

Und wenn die Uhrzeit nicht synchron ist: It's not a bug it's a feature - Falls man die Titel asynchron abspielen möchte.


Wenn ich Knoppix laufen lasse, dann weicht die Zeit nach wenigen Stunden bereits um eine ganze Minute ab. Obwohl sie ursprünglich korrekt war.

Es ist auch nicht so schwer, die Zeit halbwegs zu synchronisieren. Das hängt hauptsächlich von der Laufzeit der Pakete ab.

Die Arbeitsweise wird so sein, dass der Client am Programmstart und nach jedem empfangenen Lied den Server nach seiner Uhrzeit fragt. Gleichzeitig merkt er sich seine eigene Uhrzeit. Nach der Antwort stellt er zunächst die Laufzeit der 2 Pakete fest. Ist sie klein genug, dann nimmt er die Serverzeit, addiert die halbe Laufzeit und bildet die Differenz zu seiner eigenen gemerkten Uhrzeit.

Ist die Laufzeit zu gross, dann wird es vermutlich besser sein, davon auszugehen, dass die bereits gemerkte Differenz besser als die neue ist.

Schau'n wir mal, ob das so klappt. :rolleyes:
MfG. Cottonwood.

Beiträge: 711

Geschlecht: Männlich

19

10.01.2011, 21:31

Es klappt jetzt mit der Serverzeit. Sie weicht normalerweise max. 10 ms von der echten Serverzeit ab. Das sollte reichen.

Ich habe es mal in ein Beispielprogramm gepackt, um das anschaulich zu machen. Das war auch gleichzeitig meine Testumgebung.

UhrAnwendung ist als Client und TimeServer als Server zu starten. Das Client-Programm stellt die Uhrzeit des Servers dar, wenn es einen blauen Hintergrund hat. Bei einem roten Hintergrund ist der Server nicht verbunden. In dem Fall läuft die Zeit einfach weiter. Für die Jukebox ist das irrelevant, weil dann ja auch keine Lieder übertragen werden.

Viel Spaß beim Ausprobieren.

Das Programm TimeServer besteht in den Teilen aus dem auf dieser Seite dargestellten Programm, die die Darstellung der Uhr bewerkstelligen:
http://www.apfeltalk.de/forum/java-fenster-zwei-t318154.html
»Cottonwood« hat folgende Datei angehängt:
  • UhrAnwendung.zip (4,85 kB - 1 mal heruntergeladen - zuletzt: 10.01.2011, 21:40)
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

20

10.01.2011, 21:52

Hi,

endlich mal Source Code...
Leider lässt er sich nicht ausführen (javac TimerServer.java):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
TimeServer.java:71: cannot find symbol
symbol  : class JukePoll
location: class de.virginiacity.software.TimeServer
        JukePoll jukePoll = new JukePoll();
        ^
TimeServer.java:71: cannot find symbol
symbol  : class JukePoll
location: class de.virginiacity.software.TimeServer
        JukePoll jukePoll = new JukePoll();
                                ^
2 errors

Wegen den unterschieden in den Liedern, habe mal geguckt, er speichert das Lied und dann fängt er an zu spielen wobei die Größe auf 0 Bytes springt.

Viele Grüße
Maxi

Beiträge: 711

Geschlecht: Männlich

21

10.01.2011, 22:16

Hi Maxi,
Leider lässt er sich nicht ausführen (javac TimerServer.java):

Quellcode

1
2
3
TimeServer.java:71: cannot find symbol
symbol  : class JukePoll
location: class de.virginiacity.software.TimeServer

Sorry. Du musst die in jedem Programm 1. Zeile auskommentieren. Die gibt den Pfad zur Source an. Bei dir ist er ./ und dann muss die Zeile weg.

Wegen den unterschieden in den Liedern, habe mal geguckt, er speichert das Lied und dann fängt er an zu spielen wobei die Größe auf 0 Bytes springt.

Spiele nur 1 Lied und beende einfach den Client, wenn er "(client) waiting for the sync block." ausgibt. Dann sollte das klappen.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

22

10.01.2011, 22:36

Zitat

test.ogg temporary.ogg differieren: Byte 130601, Zeile 410.
Auch sind sie unterschiedlicher Größe.

Quellcode

1
2
3
4
5
6
7
TimeServer.java:71: cannot access JukePoll
bad class file: /home/maximilian/Downloads/javatime/JukePoll.java
file does not contain class JukePoll
Please remove or make sure it appears in the correct subdirectory of the classpath.
        JukePoll jukePoll = new JukePoll();
        ^
1 error

Beiträge: 711

Geschlecht: Männlich

23

10.01.2011, 23:00

Zitat

test.ogg temporary.ogg differieren: Byte 130601, Zeile 410.
Auch sind sie unterschiedlicher Größe.

So weit hinten habe ich das nicht erwartet. Wie groß ist die Datei? Vielleicht kann ich das ja dann nachvollziehen.

Quellcode

1
2
3
4
5
6
7
TimeServer.java:71: cannot access JukePoll
bad class file: /home/maximilian/Downloads/javatime/JukePoll.java
file does not contain class JukePoll
Please remove or make sure it appears in the correct subdirectory of the classpath.
        JukePoll jukePoll = new JukePoll();
        ^
1 error

Man soll doch zum Schluss nichts mehr ändern. Und wenn es nur Kommentare sind. ;( :rolleyes: :D :D :D
Ich hab's neu reingestellt. Diesmal gleich mit class dabei.
»Cottonwood« hat folgende Datei angehängt:
  • UhrAnwendung.zip (11,6 kB - 1 mal heruntergeladen - zuletzt: 10.01.2011, 23:08)
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

24

10.01.2011, 23:14

Zitat

So weit hinten habe ich das nicht erwartet. Wie groß ist die Datei? Vielleicht kann ich das ja dann nachvollziehen.
Das Original ungefähr 16MB, das andere 15MB.

Quellcode

1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.NoClassDefFoundError: TimeServer/class
Caused by: java.lang.ClassNotFoundException: TimeServer.class
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: TimeServer.class.  Program will exit.
Hm irgendwie bekomme ich es nicht hin. - (Eigene Meinung: Java ist mir auch irgendwie unsympathisch, wenn schon Script dann Python :thumbsup: )

Beiträge: 711

Geschlecht: Männlich

25

11.01.2011, 00:55

Hast du beim Aufruf .class dahinter stehen gehabt? Das gehört da nicht hin. Einfach nur

Quellcode

1
java TimeServer
Dann sollte das klappen.
MfG. Cottonwood.

Beiträge: 711

Geschlecht: Männlich

26

11.01.2011, 01:56

Ich habe es jetzt mal mit grösseren Dateien versucht. Bei mir gibt es keine Unterschiede. Vielleicht liegt es ja am Systemumfeld. Ich habe XP auf Client und Server. Was hast du?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
04.12.2010  21:31        14.247.866 Boney M - Felicidad (Margherita).ogg
11.01.2011  01:14        14.247.866 Boney M - Felicidad temporary.ogg
11.01.2011  01:39        21.797.598 The Rolling Stones - Midnight Rambler temporary.ogg
06.12.2010  12:41        21.797.598 The Rolling Stones - Midnight Rambler.ogg


root@Microknoppix:/home/knoppix/Desktop# cmp "Boney M - Felicidad (Margherita).ogg" "Boney M - Felicidad temporary.ogg"
root@Microknoppix:/home/knoppix/Desktop# 

root@Microknoppix:/home/knoppix/Desktop# cmp "The Rolling Stones - Midnight Rambler temporary.ogg" "The Rolling Stones - Midnight Rambler.ogg"
root@Microknoppix:/home/knoppix/Desktop# 

//Edit: Kann das sein, dass du keinen Firewall an hast? Dann könnte es nämlich auch ein Ping sein, das sich da reinmogelt.
MfG. Cottonwood.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Cottonwood« (11.01.2011, 11:27)


Beiträge: 1 150

Geschlecht: Männlich

27

11.01.2011, 16:58

Zitat

Hast du beim Aufruf .class dahinter stehen gehabt? Das gehört da nicht hin. Einfach nur
Hm, dann passiert bei mir Garnichts, sollte der Client nicht eigentlich ein Fenster öffnen?

Zitat

Ich habe XP auf Client und Server. Was hast du?
Archlinux und Archlinux.

Zitat

Kann das sein, dass du keinen Firewall an hast? Dann könnte es nämlich auch ein Ping sein, das sich da reinmogelt.
Nein, wieso auch im eigenen Netz?
Zum Internet hin bin ich abgesichert, aber mein Rechner macht eh keine Ports nach außen auf und der Software, die ich installiere, vertraue ich.
Wenn es daran liegen sollte, dann solltest Du das ändern... Man sollte doch pingen können...

Ich warte jetzt einfach mal, bis Du das Update mit der Synchronisation bringst und werde dann weiter testen.
Durch die Synchronisation sollte es dann eh egal sein, das Programm läuft ja einfach weiter.

Beiträge: 711

Geschlecht: Männlich

28

11.01.2011, 19:19

Zitat

Hast du beim Aufruf .class dahinter stehen gehabt? Das gehört da nicht hin. Einfach nur
Hm, dann passiert bei mir Garnichts, sollte der Client nicht eigentlich ein Fenster öffnen?

Ja, sollte er. Allerdings nur, wenn du UhrAnwendung startest. Wenn du TimeClient startest, dann orgeln die lustig vor sich hin, wissen alles, sagen aber nichts.

Zitat

Ich habe XP auf Client und Server. Was hast du?
Archlinux und Archlinux.

Ich könnte es mal mit Knoppix/Knoppix probieren. Allerdings ist das für mich ziemlich umständlich. Ich warte auch erst mal, bis die nächste Version fertig ist.

Zitat

Kann das sein, dass du keinen Firewall an hast? Dann könnte es nämlich auch ein Ping sein, das sich da reinmogelt.
Nein, wieso auch im eigenen Netz?
Zum Internet hin bin ich abgesichert, aber mein Rechner macht eh keine Ports nach außen auf und der Software, die ich installiere, vertraue ich.
Wenn es daran liegen sollte, dann solltest Du das ändern... Man sollte doch pingen können...

Ich warte jetzt einfach mal, bis Du das Update mit der Synchronisation bringst und werde dann weiter testen.
Durch die Synchronisation sollte es dann eh egal sein, das Programm läuft ja einfach weiter.

Ich hatte einfach den Verdacht, dass da irgend eine Anwendung die Ports anpingt. Das führt bei der jetzigen Version zu solchen Ergebnissen.
In der nächsten Version frage ich die Sender-IP ab. Nur wenn die richtig ist, werden die Daten dann verwendet. Damit könnte der Fehler dann behoben sein. Also stellen wir mal beide diesen Punkt zurück.
MfG. Cottonwood.

Beiträge: 1 150

Geschlecht: Männlich

29

11.01.2011, 19:31

Zitat

Ja, sollte er. Allerdings nur, wenn du UhrAnwendung startest. Wenn du TimeClient startest, dann orgeln die lustig vor sich hin, wissen alles, sagen aber nichts.
Jetzt tut es...

Zitat

Ich hatte einfach den Verdacht, dass da irgend eine Anwendung die Ports anpingt.
Ports kann man anpingen? - Was meinst Du damit? - Ports kann man nicht anpingen...

Beiträge: 711

Geschlecht: Männlich

30

11.01.2011, 20:00

Ports kann man anpingen? - Was meinst Du damit? - Ports kann man nicht anpingen...

Wahrscheinlich habe ich den falschen Ausdruck benutzt. Ich hatte mal irgendwo gelesen, dass es Programme gibt, die aus dem Internet heraus IP's anpingen und nach offenen Ports suchen.
Vielleicht so etwas:

Zitat von »http://forum.chip.de/windows-xp/ping-befehl-command-prompt-port-915790.html«

Du kannst allerdings mit telnet auf Ports zugreifen. Damit bekommst du zumindest die Rückmeldung, ob dieser erreichbar ist und meist auch, welcher Server inkl. Versionsnummer dahintersteht.
Z.B. telnet 192.168.1.1 21 greift auf Port 21 zu und auf einen evtl. vorhandenen FTP Server.
MfG. Cottonwood.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cottonwood« (11.01.2011, 20:06)


Linux HardwareLinux Computer & PCs | Linux Notebooks & Laptops | Geek Shirts | Geek und Nerd Shirt Shop