Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 04:29

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Dez 31, 2010 17:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Hi,

Die Frage habe ich zwar schonmal in einem anderen Forum gestellt aber dort tut sich nicht viel :( . Da sich hier ja auch einige mit Netzwerkprogrammierung beschäftigen, hoffe ich einfach mal das jemand Probleme in die Richtung kennt.
(Programmiersprachentechnisch geht es um Java, aber ich denke nicht das es nur ein Java Problem ist)


Für meine Bachelor-Arbeit sende ich periodisch Daten von einem Android Smartphone zu einem Server (beispielsweise alle 10s). Der Debugger sagt das die Nachricht auch wirklich alle 10s in den Netzwerkstream geschrieben wird. Wenn ich das ganze im Emulator teste oder per USB Kabel (mit Motorola Phone Tools) auf einem richtigen Smartphone eine Netzwerkverbindung aufbauen lasse, läuft es problemlos. Erwartungsgemäß kommen die Daten mti einem Abstand von ca 10s im Server an.

Im Uni WLAN-Netz gibt es aber einen sonderbaren Effekt. Die Nachrichten "gruppieren" sich. Das heißt es kommen nicht alle 10s eine Nachricht im Server an, sondern beispielsweise etwa nach 30s kommen 3 Nachrichten auf einmal an (Wie viele Nachrichten auf einmal ankommen scheint kein Schema zu haben - oder ich habe es noch nicht gefunden).

Ich persönlich denke das es am Uni WLAN Netz liegt (und somit außer mich damit abfinden nicht viel zu tun ist), wäre aber für eine zweite Meinung (von jemand der mehr Erfahrung mit Netzwerknachrichten und Co hat) dankbar.

Insbesondere hab ich zwei Fragen:
1) Kann es sich um einen Programmierfehler meinerseits handeln? Kann es sein das ich vergessen habe ein Flag zu setzen, oder sowas in die Richtung? Oder liegt es wahrscheinlich wirklich einfach am Uni WLAN Netz und ich habe keinen Einfluss darauf.
2) Wenn es am Uni WLAN Netz liegt, hat jemand eine Ahnung oder Vermutung was das auslösen könnte?


Das ganze läuft über Standard Java Sockets (Ausschnitt von der Erstellung des Sockets in der Android App):
Code:
socket = new Socket(ip, port);

ObjectOutputStream output = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
output.flush();

ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));

socket.setKeepAlive(true);
socket.setTcpNoDelay(true);


Danke schonmal im Vorraus.

edit 1: Was verbessert was missverständlich war


Zuletzt geändert von Deathball am Fr Dez 31, 2010 19:56, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 31, 2010 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
2) Wenn es am Uni WLAN Netz liegt, hat jemand eine Ahnung oder Vermutung was das auslösen könnte?

Wird "output.flush();" auch immer aufgerufen wenn du was senden willst? Ggf. hängt das in deinem BufferedOutputStream fest...
Wie lange dauert den ein ping vom Handy zum Server über das Uni-WLAN?
Was passiert wenn du alle 10 Sekunden einfach drei Pakete schickst?
Hast du mal ein anderes WLAN probiert?
Details zum Uni-WLAN helfen vielleicht auch. Um was handelt es sich? Eduroam? Oder "offen für alle, aber man braucht VPN"? Im letzteren Fall könnte es an deinem VPN-Client auf dem Handy liegen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 31, 2010 20:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Coolcat hat geschrieben:
Zitat:
2) Wenn es am Uni WLAN Netz liegt, hat jemand eine Ahnung oder Vermutung was das auslösen könnte?

Wird "output.flush();" auch immer aufgerufen wenn du was senden willst? Ggf. hängt das in deinem BufferedOutputStream fest...


Jop, das wird jedes Mal aufgerufen. Daran liegt es nicht.

Zitat:
Wie lange dauert den ein ping vom Handy zum Server über das Uni-WLAN?

Hm, noch gar nicht ausprobiert. Ich werde mal versuchen es zu testen, wenn ich das nächste mal in der Uni bin.

Zitat:
Was passiert wenn du alle 10 Sekunden einfach drei Pakete schickst?

Ok, das war missverständlich. Das mti den 3 Nachrichten war ein Beispiel. Mal kommen 3 auf einmal an, mal kommen 5 an, es hat leider kein Schema. Aber einfach mal nochn paar sinnlose Nachrichten hinterherschicken hab ich noch nicht ausprobiert, das wäre auch ein Versuch werd.

Zitat:
Hast du mal ein anderes WLAN probiert?

Leider hab ich (zumindest derzeit) kein anderes WLAN zur Verfügung :(

Zitat:
Details zum Uni-WLAN helfen vielleicht auch. Um was handelt es sich? Eduroam? Oder "offen für alle, aber man braucht VPN"? Im letzteren Fall könnte es an deinem VPN-Client auf dem Handy liegen.


Das Smartphone ist in Eduroam angemeldet. Der Server (aka mein Laptop) ist in einem ungesicherten Uni-Netz Namens Winulum und nutzt dann VPN.
(Auf die Art ist sicher gestellt, das ich überhaupt Nachrichten senden kann, denn Smartphone und Server nutzen die gleichen Login Daten)
Viel mehr kann ich aber leider auch nicht über das Netz sagen (zumindest fällt mir im Moment nichts mehr ein).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 31, 2010 20:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ah...also das der Server auch im WLAN ist ist eine wichtige Info ;) Hast du das ganze mal an verschiedenen Orten und Zeiten im Uni-WLAN probiert? Vielleicht war der Access-Point einfach nur überlastet...etwa im Hörsaal, weil da 200 andere sitzen die online zocken oder Youtube-Videos gucken. Oder der VPN-Server war überlastet. Ggf. hast du auch einen Access-Point mit schwachem Signal erwischt. Es wäre auch möglich das sich Laptop und Handy gegenseitig stören, z.B. weil der Access-Point falsch konfiguriert ist und beide Netzwerke auf einem Kanal liegen.

Zitat:
Ich werde mal versuchen es zu testen, wenn ich das nächste mal in der Uni bin.

Ggf. lohnt es sich für deine BA einen Access-Point zu kaufen, so teuer sind die nun auch nicht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 01, 2011 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich habe in einem Projekt ganz ähnlich mit den Netzwerkkomponenten von Java gearbeitet. Der einzige Unterschied ist der, dass ich keinen BufferedOutput/InputStream zwischen den Stream vom Socket und dem ObjectOutput/InputStream geschaltet habe. Die Daten werden vom OS sowieso gebuffered, von daher ist das nicht schlimm. Das flush() ist bei mir nicht nötig, die Daten kommen auch so an - und zwar sofort.

Das ganze läuft sowohl im LAN, Internet als auch WLAN an der Uni. Versuche einfach mal den BufferedStream wegzulassen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 02, 2011 19:39 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hoi,

ich würd's auch mal unbuffered probieren und auf jeden Fall einen eigenen AP für @home kaufen. Von TP-Link gibt's wundertolle im Low-Budget Segment (~ 20€). Die sollte auch ein Student berappen können. Denke mal, dass gerade letzteres dir am ehesten weiterhelfen wird. Gerade da du ja speziell das Uni-Netz in Verdacht hast und das auch zu Recht aus den von Coolcat angesprochenen Gründen.

just my six cent,
~ frase

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 12:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Also, ich hab jetzt ein paar Sachen ausprobiert (und insbesondere die Ping Sache find ich irgendwie deprimierend :| )
Noch als Hintergrundinfo - ich schicke dem Server Daten über Access Points, die das Android Smartphone findet (und wenn im Log steht 16 entries, dann heißt das das er eben 16 Access Points in der Umgebung gefunden hat)

@BufferedStream weglassen und trotzdem ein flush nach jeder nachricht (auszug aus meinem log vom server):
Code:
12:29:26 - INFO:   Incoming connection [...]
[...]
12:29:59 - INFO:   incoming wifi data with 16 entries
[...]
12:29:59 - INFO:   incoming wifi data with 17 entries
12:29:59 - INFO:   incoming wifi data with 18 entries
12:30:06 - INFO:   incoming wifi data with 17 entries
12:30:22 - INFO:   incoming wifi data with 19 entries
[...]
12:30:33 - INFO:   incoming wifi data with 19 entries
[...]
12:30:36 - INFO:   incoming wifi data with 18 entries
12:30:46 - INFO:   incoming wifi data with 18 entries
12:33:14 - INFO:   incoming wifi data with 19 entries
12:33:17 - INFO:   incoming wifi data with 19 entries
12:33:17 - INFO:   incoming wifi data with 15 entries
12:33:17 - INFO:   incoming wifi data with 16 entries


überall wo [...] steht hab ich dinge rausgelöscht die zur Programmlogik gehören und nix direkt mitm Netzwerk zu tun haben.
Die Datenpakete sollten eigentlich im ca. 10 Sekunden abstand ankommen - man sieht das es nur bedingt geholfen hat.

So, jetzt mit ohne BufferedStream und ohne flush nachdem die Nachrichten in den Puffer geschrieben wurden:
Code:
12:37:40 - INFO:   Incoming connection, [...]
[...]
12:38:22 - INFO:   incoming wifi data with 20 entries
12:38:22 - INFO:   incoming wifi data with 16 entries
[...]
12:38:24 - INFO:   incoming wifi data with 17 entries
12:38:24 - INFO:   incoming wifi data with 18 entries
12:38:58 - INFO:   incoming wifi data with 16 entries
12:39:00 - INFO:   incoming wifi data with 19 entries
12:39:00 - INFO:   incoming wifi data with 18 entries


Hat also auch nicht viel verändert.

Zum vergleich, mit BufferedStreams und flush nach jeder Nachricht:
Code:
12:42:52 - INFO:   Incoming connection [...]
[...]
12:43:06 - INFO:   incoming wifi data with 16 entries
[...]
12:43:16 - INFO:   incoming wifi data with 20 entries
12:43:33 - INFO:   incoming wifi data with 18 entries
[...]
12:43:33 - INFO:   incoming wifi data with 16 entries
12:43:49 - INFO:   incoming wifi data with 16 entries
[...]
12:44:28 - INFO:   incoming wifi data with 20 entries
[...]
12:44:43 - INFO:   incoming wifi data with 20 entries
[...]
12:44:46 - INFO:   incoming wifi data with 16 entries
12:44:46 - INFO:   incoming wifi data with 17 entries
12:44:46 - INFO:   incoming wifi data with 20 entries
12:44:46 - INFO:   incoming wifi data with 22 entries


Gibt sich meiner Meinung nach nicht viel.

So, jetzt zum ping. Bevor meine Applikation gestartet wurde, gabs bei einem ping von Server zu Smartphone folgendes Ergebnis:
Code:
[...]>ping 134.93.81.54

Ping wird ausgeführt für 134.93.81.54 mit 32 Bytes Daten:
Antwort von 134.93.81.54: Bytes=32 Zeit=115ms TTL=61
Antwort von 134.93.81.54: Bytes=32 Zeit=42ms TTL=61
Antwort von 134.93.81.54: Bytes=32 Zeit=56ms TTL=61
Antwort von 134.93.81.54: Bytes=32 Zeit=78ms TTL=61

Ping-Statistik für 134.93.81.54:
    Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
    (0% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 42ms, Maximum = 115ms, Mittelwert = 72ms


Nachdem meine App gestartet wurde und anfängt ihre Aufgabe zu erledigen gabs folgendes Ergebnis:
Code:
[...]>ping 134.93.81.54

Ping wird ausgeführt für 134.93.81.54 mit 32 Bytes Daten:
Zeitüberschreitung der Anforderung.
Antwort von 134.93.81.54: Bytes=32 Zeit=2185ms TTL=61
Antwort von 134.93.81.54: Bytes=32 Zeit=1471ms TTL=61
Zeitüberschreitung der Anforderung.

Ping-Statistik für 134.93.81.54:
    Pakete: Gesendet = 4, Empfangen = 2, Verloren = 2
    (50% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 1471ms, Maximum = 2185ms, Mittelwert = 1828ms

:cry:


Das mit den sinnlosen Nachrichten hinterher senden probier ich nach dem Mittagessen aus.

Allerdings habe ich gerade eine weitere, grausam bösartige Vermutung, die mir den Tag verderben könnte.

Ich sammle ja WLAN Daten - d.h. ich weise das Android System ständig an nach Access Points zu scannen (ist wirklich eine Endlosschleife, ist ein Scan fertig wird der nächste in Auftrag gegeben).
Ich hoffe einfach mal das das nicht der Grund ist, aber irgendwie beschleicht mich dieses böse Gefühl - ich werde beim Mittagessen drüber nachdenken... :?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Kannst du deinen Traffic mit Wireshark überprüfen? Vielleicht geht da noch was ganz anderes schief, vorallem, wenn der Ping explodiert.
//Edit: Den letzten Absatz habe ich übersehen: Mach doch mal ne 10ms bis 1s pause zwischen den Scans und sieh, ob das hilft.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Weiß jemand wie so ein Scan nach WLAN-Netzwerken funktioniert? Vielleicht bombst du da unwissentlich das WLAN mit Such-Paketen zu...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 13:32 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Für den Fall, dass du's nicht bereits schon tust: Streams wieder zumachen! Am besten mit try .. finally { stream.close(); } und entsprechendem Exception-Handling. Da kann man böse auf die Nase fallen, wenn man Streams offen lässt.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 13:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Soweit ich weiß ist ein Scan passiv, nimmt aber das Device in anspruch. Will sagen, das ist eine mehr oder weniger blockende operation, die andere Netzwerkaktivitäten behindern kann (und umgekehrt). Deshalb würde ich es mal mit pausen zwischen den Scans versuchen, um auch dem normalen Netzwerkverkehr mal eine Chance zu geben.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 03, 2011 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Coolcat hat geschrieben:
Weiß jemand wie so ein Scan nach WLAN-Netzwerken funktioniert? Vielleicht bombst du da unwissentlich das WLAN mit Such-Paketen zu...


Wie Lord Horazont schon meinte sind die Scans passiv - soweit ich weiß senden die Access Points ihre Daten die ganze Zeit durch die Gegend und die Devices empfangen die Nachrichten und merken so das etwas da ein Zugangspunkt ist. Die Scan Anweisung sollte, wenn ich das richtig verstanden hab, nur dafür da sein das das Gerät auch genau das getan hat (nach den Nachrichten gehorcht).

Frase hat geschrieben:
Für den Fall, dass du's nicht bereits schon tust: Streams wieder zumachen! Am besten mit try .. finally { stream.close(); } und entsprechendem Exception-Handling. Da kann man böse auf die Nase fallen, wenn man Streams offen lässt.


Naja, die Verbindung zum Server sollte, solange wie die App aktiv ist bestehen bleiben. Von daher machts keinen Sinn die Streams vorher wieder zu zu machen :wink:

Lord Horazont hat geschrieben:
Soweit ich weiß ist ein Scan passiv, nimmt aber das Device in anspruch. Will sagen, das ist eine mehr oder weniger blockende operation, die andere Netzwerkaktivitäten behindern kann (und umgekehrt). Deshalb würde ich es mal mit pausen zwischen den Scans versuchen, um auch dem normalen Netzwerkverkehr mal eine Chance zu geben.


Jup. Gerade ausprobiert, wenn ich die Scans komplett weg lasse funktioniert es - die Scans behindern also die restliche Netzwerkaktivität. :|
Das es daran liegt, darauf hätte ich eigentlich schon früher kommen können - denn eine zweite App die ich schreibe, die beim wiederholten Scannen nicht versucht irgendwelche Nachrichten zu schicken hatte diese Probleme nicht.
Auf die Idee gekommend as es daran liegen könnte bin ich aber erst durch die Pings... :oops:

So, und jetzt probier ich die Pausen zu integrieren. Danke schonmal an alle die geholfen haben und sich gedanken gemacht haben.*
Wenn es mit den Pausen wirklich funktioniert (ansonsten habe ich noch eine andere Idee, die aber unschöner wäre), dann editier oder poste ich es natürlich nochmal hier rein.


* ich finds btw. lustig das in dem Android Forum, indem ich die Fragen auch gestellt hab, kein einziger geantwortet hat (und da hab ich die Frage ne Woche vorher gestellt), während hier, in nem Forum das eigentlich gar nix mit dem Thema am Hut hat, sofort Leute helfen und sich Gedanken machen. Dafür nochmal ein ganz großes Danke.


edit: So, jetzt nochmal das endgültige Fazit - es lag an zwei Dingen.
Zum einen hat das Scannen in der Endlosschleife die Netzwerkkommunikation des Smartphones blockiert. Wie Lord Horazont vorgeschlagen hat war eine kurze Pause zwischen den Scans ausreichend damit die Nachrichten rein und raus konnten. Die besten Erfahrungen hab ich mit der Pausenzeit von 1 Sekunde gemacht.
Der zweite Punkt der an dem Problem mitgearbeitet hat war die CPU. Wenn das Telefon in den Ruhemodus gegangen ist (also Bildschirm aus), dann wurde auch die CPU gedrosselt (was irgendwie logisch ist, da man da ja Strom sparen kann). Allerdings war dann nicht mehr genug Power da um zu scannen und die Nachrichten zu verschicken. Da hat ein PARTIAL_WAKE_LOCK geholfen. Damit kann das Telefon zwar in den Ruhemodus wechseln, aber die CPU wird nicht gedrosselt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]