UDP Empfangen Funktioniert nicht!

  • 11 Antworten
  • Letztes Antwortdatum
M

mitch_HD2

Fortgeschrittenes Mitglied
1
Hallo zusammen
Ich sende von einem Netzwerk Modul ein jede 2 sekunden per UDP einen Temperaturwert an mein Android phone.....
Dies kann es aber nicht Empfangen...
wenn ich das Paket an mein PC schicke sehe ich im Wireshark dass es ankommt.

Android spuckt mir aber ein Fehler aus.. auch schon mit Asynctask probiert und ohne...
er spring direkt in den Exception...

Hier erstmal mein Code
Code:
package mitch.bariotemp;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;




public class BarioTemp extends Activity {
	
	Button sync;
	TextView Temptxt;
	
	int Port = 12301;
	String ip = "129.1.110.200";
	byte[] message = new byte[1500];
	String text;
	
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_bario_temp, menu);
        return true;
    }

    
 	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_bario_temp);
	    
	    sync = (Button)findViewById(R.id.Sync);
	    Temptxt = (TextView)findViewById(R.id.temp);
	    
	    
	    sync.setOnClickListener(syncfkt);
	    //new Connection().execute();
	    //Connect();
	}	


	private OnClickListener syncfkt = new OnClickListener(){
    
		public void onClick(View v) {
		
			new Connection().execute();
			//Connect();
			
		}
	    };
		
		
		
 	 private class Connection extends AsyncTask<Object, Object, Object> {
     	
     	@Override
         protected Object doInBackground(Object... arg0) {
     	
             Connect();
             
             return null;
         }

 	 }
 
    public void Connect(){
    	Temptxt.setText("test222");
    	
    	try {
    	      DatagramSocket clientsocket=new DatagramSocket(12301);
    	      byte[] receivedata = new byte[2048];
    	      while(true)
    	      {
    	        DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length);
    	        Log.d("UDP", "S: Receiving...");
    	        clientsocket.receive(recv_packet);
    	        String rec_str = new String(message, 0, recv_packet.getLength());
    	        Temptxt.setText(rec_str);
    	        Log.d(" Received String ",rec_str);
    	        InetAddress ipaddress = recv_packet.getAddress();
    	        int port = recv_packet.getPort();
    	        Log.d("IPAddress : ",ipaddress.toString());
    	        Log.d(" Port : ",Integer.toString(port));
    	      }
    	    } catch (Exception e) {
    	      Log.e("UDP", "S: Error", e);
    	    }
    	
    	/*
    	try {
    		InetAddress serverAddr = InetAddress.getByName(ip); //die IP vom editttext wird in einer Internetadresse umgewandelt 
    		DatagramPacket p = new DatagramPacket(message, message.length);
    		DatagramSocket s = new DatagramSocket(Port);
    		s.receive(p);
    		text = new String(message, 0, p.getLength());
    		//text = "test";
    		Temptxt.setText(text);
    		Log.d("Udp tutorial","message:" + text);
    		s.close();
				
    	}
    	
    	catch (Exception e) 
    	{
    	Log.d("Udp tutorial","test " + text);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);//alert ausgeben show nicht vergessen;)
		alert.setTitle("Fehler");// überschrift des buttons
		alert.setMessage("Verbindungsfehler");//Text des Buttons
		alert.setPositiveButton("OK", null);//Position des OK Buttons
		alert.show();//zeigt alert an
    	} */
    }
}

Also wie ihr seht soll der das Paket empfangen wenn ich auf den Button drücke..

nur eins verstehe ich nicht ganz.. Ich schicke das Paket ja jede 2 sekunden...
und ich drücke ja nicht in der selben Zeit den Button... ?!
kann mir das mal jemand erklären?

LogCat:
Code:
11-26 13:48:10.285: D/OpenGLRenderer(5266): Enabling debug mode 0
11-26 13:48:13.410: W/dalvikvm(5266): threadid=11: thread exiting with uncaught exception (group=0x40fe62a0)
11-26 13:48:13.430: E/AndroidRuntime(5266): FATAL EXCEPTION: AsyncTask #1
11-26 13:48:13.430: E/AndroidRuntime(5266): java.lang.RuntimeException: An error occured while executing doInBackground()
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.lang.Thread.run(Thread.java:856)
11-26 13:48:13.430: E/AndroidRuntime(5266): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4865)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:947)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.View.requestLayout(View.java:15430)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.View.requestLayout(View.java:15430)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.View.requestLayout(View.java:15430)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.View.requestLayout(View.java:15430)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.view.View.requestLayout(View.java:15430)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.widget.TextView.checkForRelayout(TextView.java:6611)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.widget.TextView.setText(TextView.java:3705)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.widget.TextView.setText(TextView.java:3563)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.widget.TextView.setText(TextView.java:3538)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at mitch.bariotemp.BarioTemp.Connect(BarioTemp.java:83)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at mitch.bariotemp.BarioTemp$Connection.doInBackground(BarioTemp.java:75)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-26 13:48:13.430: E/AndroidRuntime(5266): 	... 5 more

und hier der LogCat ohne Asynctask

Code:
11-26 13:50:26.330: E/UDP(6594): S: Error
11-26 13:50:26.330: E/UDP(6594): java.lang.IllegalArgumentException: Port out of range: 123012
11-26 13:50:26.330: E/UDP(6594): 	at java.net.DatagramSocket.checkPort(DatagramSocket.java:100)
11-26 13:50:26.330: E/UDP(6594): 	at java.net.DatagramSocket.<init>(DatagramSocket.java:77)
11-26 13:50:26.330: E/UDP(6594): 	at mitch.bariotemp.BarioTemp.Connect(BarioTemp.java:86)
11-26 13:50:26.330: E/UDP(6594): 	at mitch.bariotemp.BarioTemp$1.onClick(BarioTemp.java:63)
11-26 13:50:26.330: E/UDP(6594): 	at android.view.View.performClick(View.java:4211)
11-26 13:50:26.330: E/UDP(6594): 	at android.view.View$PerformClick.run(View.java:17267)
11-26 13:50:26.330: E/UDP(6594): 	at android.os.Handler.handleCallback(Handler.java:615)
11-26 13:50:26.330: E/UDP(6594): 	at android.os.Handler.dispatchMessage(Handler.java:92)
11-26 13:50:26.330: E/UDP(6594): 	at android.os.Looper.loop(Looper.java:137)
11-26 13:50:26.330: E/UDP(6594): 	at android.app.ActivityThread.main(ActivityThread.java:4898)
11-26 13:50:26.330: E/UDP(6594): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-26 13:50:26.330: E/UDP(6594): 	at java.lang.reflect.Method.invoke(Method.java:511)
11-26 13:50:26.330: E/UDP(6594): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
11-26 13:50:26.330: E/UDP(6594): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
11-26 13:50:26.330: E/UDP(6594): 	at dalvik.system.NativeStart.main(Native Method)

Danke
 
Du setzt in der Connect()-Methode (also im AsyncTask-Thread) öfter mal Text in deine TextView - ich schätze deswegen meckert er mit "CalledFromWrongThreadException".

Wegen Nicht-Erreichbarkeit des Ports - wie kommst du auf diese Portnummer?
 
So ich habe bemerkt... dass der bis hierhin " Log.d("UDP", "S: Receiving...");" spring
und erst sobald ich dann das UDP paket schicke dann fliegt der erst in error

Der ursprüngliche Beitrag von 14:40 Uhr wurde um 14:52 Uhr ergänzt:

Hab den Fehler... nur kann es mir nciht erklären

Code:
String rec_str = new String(receivedata, 0, recv_packet.getLength());
    	        Temptxt.setText(rec_str);
    	        Log.d(" Received String ",rec_str);

sobald ich " Temptxt.setText(rec_str);" auskommentiert funktioniert es...

rec_str ist doch ein String.. wieso kann ich es nicht anzeigen!?
 
du darfst ui elemente nur im ui thread verändern, sprich deine textview darfst nicht im doinbackground verändern, sondern im onPostExecute.

könnste auch einfach den empfangenen text dann über publishprogress weitergeben und dann in onPublishProgress (methoden könnten geringfügig anders heißen) in die textview setzen - das wird auch im ui thread ausgeführt
 
Alles klar! erledigt!:) kann weg;)

der setText!.. darf nicht in die try routine...
 
Code:
java.lang.IllegalArgumentException: Port out of range: 123012
Steht doch schon im Logcat, dass der Port nicht geht. 65535 ist max.
 
ne das war ein tipfehler mit dem Port:) sollte 12302 sein...
war aber nicht das Problem...
wie mach ich das denn nun mit dem setText? damit der mir in die TextView den text aktualisiert bei jedem Receive..

LOG "11-26 15:49:05.530: E/UDP(24723): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views"

was heißt das nun?:(
 
Zuletzt bearbeitet:
Ich mache so etwas immer lieber mit Handlern als mit einem AsyncTask.

Einfach ein Handler-Objekt global definieren, für die Netzwerk-Routine einen eigenen Thread starten, die Zwischenmeldungen dem Handler schicken (den String einfach als Objekt an die Message hängen) und die *.setText() aufrufen lassen.

/e: Oder wie swordi meinte in der Async-Klasse onPostExecute() für die TextView-Aktualisierung nutzen - ist dann aber nicht Echtzeit, soweit ich das überblicken kann ...
 
AsyncTasks sollten sowieso nicht länger als ein paar Sekunden laufen und dann terminieren. Wenn man eine while(true) Schleife drin hat, dann kann man mit onPostExecute() ja eh nichts anfangen. Also Schleife raus, AsyncTask extern alle 2 Sek aufrufen und EditText im onPostExecute aktualisieren, oder man löst das ganze mit einem Thread + Handler.
 
im onProgressUpdate kannst das auch machen.

ansonsten würde ich nicht den asynctask alle x sek aufrufen. lass doch einen service laufen und schicke das ergebnis dann an die gui
 
Danke:) habs nun mit onPostExecute() gelöst...

mhh jetzt hätte ich noch eine Frage...

wenn mein Server jetzt wegfliegt.. und nix schickt...
dann wartet mein Android ganze zeit auf ein Empfang..

kann ich ihm irgendwie sagen dass wenn der in 10 sec. nichts bekommt dass er abbrechen soll?
 
weiß niemnand Rat?:(
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
499
AnnaBauer21
AnnaBauer21
AnnaBauer21
Antworten
6
Aufrufe
1.018
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten