UDP parallel zu TCP

  • Antworten:4
LitteM
  • Forum-Beiträge: 141

03.05.2013, 19:17:15 via Website

Dieses Mal nicht vorschnell den Thread erstellt *stolzist*

Also, zu meiner Frage. Der Titel sagt eigentlich schon alles.
Ich würde gerne per UDP eine variable Anzahl an UDP Paketen versenden. Sobald mein Tablet aber ein TCP Paket von einem Server erhält, soll der UDP Sendevorgang abgebrochen werden. Das ganze soll dann per Knopfdruck wieder von vorne ablaufen.

Ist es möglich UDP "parallel" zu TCP laufen zu lassen? Ich habe für UDP und TCP jeweils einen Thread erstellt. Diese funktionieren unabhängig voneinander und tun was sie sollen. Leider scheitere ich daran den UDP Thread zu pausieren sobald ein TCP Paket reinkommt.

Ich hoffe dass ich keinen älteren Thread übersehen habe und freue mich über jegliche Hilfe!

Grüße :)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

04.05.2013, 13:35:00 via Website

Du musst dir eine condition schreiben. Dies könnte z.b ein AtomicBoolean sein, dadurch ist sichergestellt das dein TCP Thread die änderung auch sieht.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
LitteM
  • Forum-Beiträge: 141

06.05.2013, 20:10:36 via Website

Das was ich bisher zusammengebastelt habe funktioniert noch nicht so wirklich. Der Server sendet pro Sekunde ein Paket raus. So wie ich es bisher unten realisiert habe empfängt mein Tablet 2-3 Pakete, dann wenige Sekunden nichts, dann wieder ein paar Pakete.
Schlussendlich hängt sich mein Router auf. Wenn du mir ein Tipp hast was ich noch falsch mache wäre ich sehr dankbar :)


1private volatile AtomicBoolean cancelPending = new AtomicBoolean(false);

Die Warteschleife in Thread1 den ich gerne pausieren würde
1while(cancelPending.get()){
2 try {
3 Thread.sleep(10);
4 } catch (InterruptedException e) {
5 // TODO Auto-generated catch block
6 e.printStackTrace();
7 }
8 }


"Stop/Start" Methoden die ich aus Thread 2 aufrufe
1public void stop() {
2 cancelPending.set(true);
3 }
4
5 public void start() {
6 cancelPending.set(false);
7 }


In Thread2 habe ich die stop methode direkt nach "socket = new Socket("192.168.2.2", 8888);" aufgerufen. Allerdings bin ich mir noch nich ganz sicher ob ich das überhaupt so machen darf. An welcher Stelle in meinem Thread sollte ich den anderen am besten blockieren?
1mBackground3 = new Thread(new Runnable()
2 {
3 public void run()
4 {
5 Log.w("TCP THREAD", "Starte run");
6 Log.w("finish status", ""+finish);
7
8 Socket socket = null;
9 DataOutputStream dataOutputStream = null;
10 DataInputStream dataInputStream = null;
11 Log.w("TCP THREAD", "Socket und Streams initialisiert");
12 do{
13
14 try {
15
16start();
17
18 socket = new Socket("192.168.2.2", 8888); //Connect on server socket
19
20 stop();
21
22 dataInputStream = new DataInputStream(socket.getInputStream());;
23 String message = dataInputStream.readUTF();
24 Log.w("INCOMMING MESSAGE", "content: "+message+" <- received");
25
26
27 } catch (UnknownHostException e) {
28 e.printStackTrace();
29 } catch (IOException e) {
30 e.printStackTrace();
31 }
32 finally{
33 if (socket != null){
34 try {
35 socket.close();
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 if (dataOutputStream != null){
42 try {
43 dataOutputStream.close();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48
49 if (dataInputStream != null){
50 try {
51 dataInputStream.close();
52 } catch (IOException e) {
53 e.printStackTrace();
54 }
55 }
56 }
57
58 }while(finish==true);
59 }
60 });


Fehlermeldung die nach wenigen einkommenden Paketen in der Console vom Server kommt:
1java.net.SocketException: Connection reset by peer: socket write error
2 at java.net.SocketOutputStream.socketWrite0(Native Method)
3 at java.net.SocketOutputStream.socketWrite(Unknown Source)
4 at java.net.SocketOutputStream.write(Unknown Source)
5 at java.io.DataOutputStream.write(Unknown Source)
6 at java.io.DataOutputStream.writeUTF(Unknown Source)
7 at java.io.DataOutputStream.writeUTF(Unknown Source)
8 at Server.main(Server.java:33)

— geändert am 06.05.2013, 20:14:23

Antworten
LitteM
  • Forum-Beiträge: 141

07.05.2013, 19:00:04 via Website

Eine isConnected Abfrage im UDP Thread hat auch nicht funktioniert.

Gibts weitere Verbesserungsvorschläge für meinen Code oben oder neue Anregungen? -_-

Antworten
LitteM
  • Forum-Beiträge: 141

07.05.2013, 23:00:07 via Website

Habe zum Testen mal ein 1ms warte-zeit in meinen UDP-Thread eingefügt.
Immerhin bleibt mir jetzt der Router am leben und soweit ich es testen konnte sollten alle TCP Pakete reingekommen sein.
Allerdings schwankt die Zahl der gesendeten UDP Pakete zwischen dem Eintreffen der TCP Pakete (1 Paket pro Sekunde wird vom Server gesendet) zwischen 2 und 35.

Hat das irgendwas mit den Sende/Empfangs-Buffern zu tun? (sofern wenn ich UDP ohne verzögerung sende). Ich dachte eigentlich, dass die sich nicht stören sollten. Greifen die auf einen gemeinsamen Speicher zu und aufgrund der massenhaften UDP-sende-pakete wird dieser quasi blockiert und einkommende TCP Pakete werden gedroppt?

— geändert am 07.05.2013, 23:03:06

Antworten