einfache Client/Server Kommunikation

  • Antworten:23
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 2.492

21.11.2013 17:58:13 via Website

Hallo,

ich wollte gerne eine Client/Server Kommunikation herstellen, bei der zuerst nur der Client eine Nachricht an den Server senden kann.
Weil ich mich damit nicht auskenne habe ich einen "Standart" Code kopiert und eingefügt. Hab mir den Code durchgelesen, mich ein bisschen über Sockets informiert und den Code dann auch verstanden. Aber wenn ich den Server starten will (egal ob über Emulator oder meinem HTC) beendet sich die App.
folgender Fehler tritt auf:
1E/AndroidRuntime(13974): FATAL EXCEPTION: Thread-234759
2 E/AndroidRuntime(13974): java.lang.NullPointerException
3E/AndroidRuntime(13974): at com.example.server.MyServer$CommsThread.run(MyServer.java:73)
4E/AndroidRuntime(13974): at java.lang.Thread.run(Thread.java:864)

das ist meine Server Klasse:
1package com.example.server;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStreamReader;
6import java.net.ServerSocket;
7import java.net.Socket;
8
9import android.app.Activity;
10import android.os.Bundle;
11import android.os.Handler;
12import android.os.Message;
13import android.widget.TextView;
14
15public class MyServer extends Activity {
16 ServerSocket ss = null;
17 String mClientMsg = "";
18 Thread myCommsThread = null;
19 protected static final int MSG_ID = 0x1337;
20 public static final int SERVERPORT = 6000;
21 public static final String serverIpAddress = "10.0.2.2";
22
23 @Override
24 public void onCreate(Bundle savedInstanceState) {
25 super.onCreate(savedInstanceState);
26 setContentView(R.layout.my_server);
27 TextView tv = (TextView) findViewById(R.id.TextView01);
28 tv.setText("Noch nichts vom Client");
29 this.myCommsThread = new Thread(new CommsThread());
30 this.myCommsThread.start();
31 }
32
33 @Override
34 protected void onStop() {
35 super.onStop();
36 try {
37 ss.close();
38 } catch (IOException e) {
39 e.printStackTrace();
40 }
41 }
42
43 @Override
44protected void onResume() {
45 // TODO Auto-generated method stub
46 super.onResume();
47 this.myCommsThread.start();
48}
49
50Handler myUpdateHandler = new Handler() {
51 public void handleMessage(Message msg) {
52 switch (msg.what) {
53 case MSG_ID:
54 TextView tv = (TextView) findViewById(R.id.TextView01);
55 tv.setText(mClientMsg);
56 break;
57 default:
58 break;
59 }
60 super.handleMessage(msg);
61 }
62 };
63 class CommsThread implements Runnable {
64 public void run() {
65 Socket s = null;
66 try {
67 ss = new ServerSocket(SERVERPORT );
68 } catch (IOException e) {
69 e.printStackTrace();
70 }
71 while (!Thread.currentThread().isInterrupted()) {
72 Message m = new Message();
73 m.what = MSG_ID;
74 try {
75 if (s == null)
76 s = ss.accept();
77 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
78 String st = null;
79 st = input.readLine();
80 mClientMsg = st;
81 myUpdateHandler.sendMessage(m);
82 } catch (IOException e) {
83 e.printStackTrace();
84 }
85 }
86 }
87 }
88}

s = ss.accept(); ist die Line 73. Ich denke das es irgendwie an dem Port liegt und der Socket nicht wirklich aufgebaut wird.
Übrigens gehen ich bei meinem HTC über WLan ins Internet.

Hat einer eine Idee wie ich das lösen kann? Ich würde gerne eine einfache Client/Server Kommunikation haben auf der ich dann aufbauen kann.

Gruß,
Lars

— geändert am 23.11.2013 10:17:25

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.207

21.11.2013 19:21:07 via App

Poste mal den vollen Code
Tipp es gibt gar keine line 73.
Und was ist dein Serverport bzw deine Serverklasse.
Ist die Permission internet gesetzt?
Was ist die Ip des servers bzw wo legst du diese fest.

— geändert am 21.11.2013 19:21:52

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 2.492

21.11.2013 19:39:16 via Website

Das ist der volle Code nur ohne imports.
Serverport ist 6000 und die Serverklasse habe ich gepostet.
Permissions sind gesetzt.
Muss ich die IP in der Server Klasse festlegen um dann in dem Client darauf zugreifen zu können?

Asynctasks wäre vielleicht ein Zusatz aber ich muss ja erstmal zum laufen bekommen oder?

— geändert am 21.11.2013 19:54:26

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.207

22.11.2013 06:24:52 via App

Poste bitte Den kompletten Code
mit imports und so, damit man sehen kann wo Zeile 73 ist...

Edit ausserdem kannst du bei der Funktion new ServerSocket nicht nur den port übergeben da muss die Ip noch rein.

Die Geschachtelten klassen sind auch nicht gerade schön...

— geändert am 22.11.2013 06:28:04

LG Pascal //It's not a bug, it's a feature. :) ;)

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.207

22.11.2013 06:30:55 via App

Du musst den Endpoint angeben mit ip und port
Aber wenn das der Server ist, must du ihn auf einen bestimmten Port binen und dann dem Client die Ip und den Port geben.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 3.112

22.11.2013 07:02:38 via App

printStackTrace ist keine gute Idee. Warum verwendest Du nicht Androids Log? Dann siehst du auch, ob eine Exception kommt.
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 6.661

22.11.2013 12:16:59 via Website

1@Override
2protected void onStop() {
3super.onStop();
4try {
5ss.close();
6} catch (IOException e) {
7e.printStackTrace();
8 }
9}

Ist zwar gut und schön das der Socket geschlossen wird, aber wann wird er wieder geöffnet --> onResume() oder der Art fehlt!
Sobald die onStop() aufgerufen wird wird die SocketException gewurfen und dein Thread wird sich tot laufen.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

  • Forum-Beiträge: 359

22.11.2013 13:07:53 via Website

Schau die auch mal gson als übertragungsprotokoll an..

— geändert am 22.11.2013 13:08:11

  • Forum-Beiträge: 1.727

22.11.2013 13:25:29 via Website

Hauptfehler ist das in einer Activity machen zu wollen, nimm einen Service dann hast du auch direkt kein Problem mehr mit dem Activity Lifecycle.

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

  • Forum-Beiträge: 2.492

23.11.2013 10:15:58 via Website

Nein nur ein bisschen ;) hatte gestern keine Zeit mal ins Forum zu schauen.

Also muss ich Client und Server eine IP-Adresse geben damit die kommunizieren können.
Habe ich gemacht auch das onResume habe ich hinzugefügt aber der Server startet nicht. Immer doch der gleiche Fehler.

kompletter Code steht jetzt oben. Fehler-Zeile ist 76.

— geändert am 23.11.2013 10:16:35

  • Forum-Beiträge: 3.112

23.11.2013 11:59:53 via Website

Du könntest es ja mal debuggen oder wie gesagt, die Exceptions auch mitloggen. Du übergehst einfach die Exceptions.

Ich vermute, dass der ServerSocket nicht erzeugt wird, so kannst Du das wenigstens überprüfen, bzw. sehen warum, wenn nicht.

— geändert am 23.11.2013 12:00:08

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.207

23.11.2013 12:28:48 via App

Probier doch mal in Zeile 76

if (s==null&ss!=null)

Damit überprüfst du os das Socket nicht null ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 1.727

23.11.2013 12:29:13 via Website

#accept wartet ja nur auf einen request. Im schlimmsten fall wartet der ewig. Da muss man raten wieso das passiert, ohne Trace. Aber wie gesagt, wurde das schon oftmals verlangt und du lieferst diese einfache Info einfach nicht. Auf raten hat hier kein mensch lust!

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

  • Forum-Beiträge: 2.492

23.11.2013 13:06:57 via Website

EDIT: Okay ich habs jetzt selbst erkannt ich hatte die Permission falsch gesetzt. Der Server startet jetzt normal. Es scheint also als wenn er auch ein Socket aufbaut. Aber wenn ich jetzt beim Client senden will kommt wieder ein Fehler :(

Das ist der Client:
1package com.example.server;
2
3import java.io.IOException;
4import java.net.Socket;
5
6import android.app.Activity;
7import android.os.Bundle;
8import android.widget.TextView;
9
10import java.io.BufferedWriter;
11import java.io.OutputStreamWriter;
12import java.io.PrintWriter;
13import java.net.InetAddress;
14import java.net.UnknownHostException;
15
16import android.util.Log;
17import android.view.View.OnClickListener;
18import android.widget.Button;
19import android.widget.EditText;
20import android.view.View;
21
22public class MyClient extends Activity {
23 private Button bt;
24 private TextView tv;
25 private Socket socket;
26 private String serverIpAddress = "10.0.2.2";
27 //
28 //
29 //
30 private static final int REDIRECTED_SERVERPORT = 6000;
31 @Override
32 public void onCreate(Bundle savedInstanceState) {
33 super.onCreate(savedInstanceState);
34 setContentView(R.layout.my_server);
35 bt = (Button) findViewById(R.id.myButton);
36 tv = (TextView) findViewById(R.id.myTextView);
37 try {
38 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
39 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
40 } catch (UnknownHostException e1) {
41 e1.printStackTrace();
42 } catch (IOException e1) {
43 e1.printStackTrace();
44 }
45 bt.setOnClickListener(new OnClickListener() {
46 public void onClick(View v) {
47 try {
48 EditText et = (EditText) findViewById(R.id.EditText01);
49 String str = et.getText().toString();
50 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
51 out.println(str);
52 Log.d("Client", "Client sent message");
53 } catch (UnknownHostException e) {
54 tv.setText("Error1");
55 e.printStackTrace();
56 } catch (IOException e) {
57 tv.setText("Error2");
58 e.printStackTrace();
59 } catch (Exception e) {
60 tv.setText(e.toString() + "Error3");
61 e.printStackTrace();
62 }
63 }
64 });
65 }
66}

und das die LogCat:
111-23 12:39:04.306: I/dalvikvm(627): threadid=3: reacting to signal 3
211-23 12:39:04.406: I/dalvikvm(627): Wrote stack traces to '/data/anr/traces.txt'
311-23 12:39:04.466: D/AndroidRuntime(627): Shutting down VM
411-23 12:39:04.466: W/dalvikvm(627): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
511-23 12:39:04.476: E/AndroidRuntime(627): FATAL EXCEPTION: main
611-23 12:39:04.476: E/AndroidRuntime(627): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.server/com.example.server.MyClient}: android.os.NetworkOnMainThreadException
711-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
811-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
911-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread.access$600(ActivityThread.java:123)
1011-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
1111-23 12:39:04.476: E/AndroidRuntime(627): at android.os.Handler.dispatchMessage(Handler.java:99)
1211-23 12:39:04.476: E/AndroidRuntime(627): at android.os.Looper.loop(Looper.java:137)
1311-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread.main(ActivityThread.java:4424)
1411-23 12:39:04.476: E/AndroidRuntime(627): at java.lang.reflect.Method.invokeNative(Native Method)
1511-23 12:39:04.476: E/AndroidRuntime(627): at java.lang.reflect.Method.invoke(Method.java:511)
1611-23 12:39:04.476: E/AndroidRuntime(627): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
1711-23 12:39:04.476: E/AndroidRuntime(627): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
1811-23 12:39:04.476: E/AndroidRuntime(627): at dalvik.system.NativeStart.main(Native Method)
1911-23 12:39:04.476: E/AndroidRuntime(627): Caused by: android.os.NetworkOnMainThreadException
2011-23 12:39:04.476: E/AndroidRuntime(627): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
2111-23 12:39:04.476: E/AndroidRuntime(627): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
2211-23 12:39:04.476: E/AndroidRuntime(627): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
2311-23 12:39:04.476: E/AndroidRuntime(627): at libcore.io.IoBridge.connect(IoBridge.java:112)
2411-23 12:39:04.476: E/AndroidRuntime(627): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
2511-23 12:39:04.476: E/AndroidRuntime(627): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
2611-23 12:39:04.476: E/AndroidRuntime(627): at java.net.Socket.startupSocket(Socket.java:566)
2711-23 12:39:04.476: E/AndroidRuntime(627): at java.net.Socket.<init>(Socket.java:225)
2811-23 12:39:04.476: E/AndroidRuntime(627): at com.example.server.MyClient.onCreate(MyClient.java:39)
2911-23 12:39:04.476: E/AndroidRuntime(627): at android.app.Activity.performCreate(Activity.java:4465)
3011-23 12:39:04.476: E/AndroidRuntime(627): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
3111-23 12:39:04.476: E/AndroidRuntime(627): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
3211-23 12:39:04.476: E/AndroidRuntime(627): ... 11 more
3311-23 12:39:04.806: I/dalvikvm(627): threadid=3: reacting to signal 3
3411-23 12:39:04.816: I/dalvikvm(627): Wrote stack traces to '/data/anr/traces.txt'
3511-23 12:39:04.996: I/dalvikvm(627): threadid=3: reacting to signal 3
3611-23 12:39:05.006: I/dalvikvm(627): Wrote stack traces to '/data/anr/traces.txt'
3711-23 12:39:07.046: I/Process(627): Sending signal. PID: 627 SIG: 9

Ich glaube es liegt daran, dass ich nicht richtig verstehe wie ich den Client und den Server verbinden muss.


Danke für die Antworten.
Wie man beim debuggen einen Fehler findet weiß ich leider überhaupt nicht. Ich hab mich damit noch nicht beschäftigt. Gibt es ne Möglichkeit da irgendwas auszulesen was ich dann hier posten kann?

Das ist jetzt mal der komplette LogCat Post:
111-23 12:56:20.748: W/System.err(10276): java.net.SocketException: socket failed: EACCES (Permission denied)
211-23 12:56:20.748: W/System.err(10276): at libcore.io.IoBridge.socket(IoBridge.java:573)
311-23 12:56:20.758: W/System.err(10276): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
411-23 12:56:20.758: D/AndroidRuntime(10276): Shutting down VM
511-23 12:56:20.758: W/dalvikvm(10276): threadid=1: thread exiting with uncaught exception (group=0x40aa7228)
611-23 12:56:20.758: W/System.err(10276): at java.net.PlainServerSocketImpl.create(PlainServerSocketImpl.java:38)
711-23 12:56:20.758: W/System.err(10276): at java.net.ServerSocket.<init>(ServerSocket.java:98)
811-23 12:56:20.758: W/System.err(10276): at java.net.ServerSocket.<init>(ServerSocket.java:69)
911-23 12:56:20.758: W/System.err(10276): at com.example.server.MyServer$CommsThread.run(MyServer.java:74)
1011-23 12:56:20.758: W/System.err(10276): at java.lang.Thread.run(Thread.java:864)
1111-23 12:56:20.758: W/System.err(10276): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
1211-23 12:56:20.768: W/System.err(10276): at libcore.io.Posix.socket(Native Method)
1311-23 12:56:20.768: W/System.err(10276): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
1411-23 12:56:20.768: W/System.err(10276): at libcore.io.IoBridge.socket(IoBridge.java:558)
1511-23 12:56:20.768: W/System.err(10276): ... 6 more
1611-23 12:56:20.768: E/AndroidRuntime(10276): FATAL EXCEPTION: main
1711-23 12:56:20.768: E/AndroidRuntime(10276): java.lang.RuntimeException: Unable to resume activity {com.example.server/com.example.server.MyServer}: java.lang.NullPointerException
1811-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2823)
1911-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2862)
2011-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
2111-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.access$600(ActivityThread.java:139)
2211-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
2311-23 12:56:20.768: E/AndroidRuntime(10276): at android.os.Handler.dispatchMessage(Handler.java:99)
2411-23 12:56:20.768: E/AndroidRuntime(10276): at android.os.Looper.loop(Looper.java:156)
2511-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.main(ActivityThread.java:4977)
2611-23 12:56:20.768: E/AndroidRuntime(10276): at java.lang.reflect.Method.invokeNative(Native Method)
2711-23 12:56:20.768: E/AndroidRuntime(10276): at java.lang.reflect.Method.invoke(Method.java:511)
2811-23 12:56:20.768: E/AndroidRuntime(10276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
2911-23 12:56:20.768: E/AndroidRuntime(10276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
3011-23 12:56:20.768: E/AndroidRuntime(10276): at dalvik.system.NativeStart.main(Native Method)
3111-23 12:56:20.768: E/AndroidRuntime(10276): Caused by: java.lang.NullPointerException
3211-23 12:56:20.768: E/AndroidRuntime(10276): at com.example.server.MyServer.onResume(MyServer.java:49)
3311-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1236)
3411-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.Activity.performResume(Activity.java:4620)
3511-23 12:56:20.768: E/AndroidRuntime(10276): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2807)
3611-23 12:56:20.768: E/AndroidRuntime(10276): ... 12 more
3711-23 12:56:20.788: W/dalvikvm(10276): threadid=11: thread exiting with uncaught exception (group=0x40aa7228)
3811-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): crash in the same process: Thread-249672
3911-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
4011-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at android.os.Handler.<init>(Handler.java:121)
4111-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at android.widget.Toast$TN.<init>(Toast.java:317)
4211-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at android.widget.Toast.<init>(Toast.java:91)
4311-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at android.widget.Toast.makeText(Toast.java:233)
4411-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at com.example.server.MyServer$CommsThread.run(MyServer.java:77)
4511-23 12:56:20.788: E/AndroidRuntime_2_crash(10276): at java.lang.Thread.run(Thread.java:864)
4611-23 12:56:22.700: D/Process(10276): killProcess, pid=10276
4711-23 12:56:22.710: D/Process(10276): dalvik.system.VMStack.getThreadStackTrace(Native Method)
4811-23 12:56:22.730: D/Process(10276): java.lang.Thread.getStackTrace(Thread.java:599)
4911-23 12:56:22.730: D/Process(10276): android.os.Process.killProcess(Process.java:807)
5011-23 12:56:22.730: D/Process(10276): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:104)
5111-23 12:56:22.740: D/Process(10276): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
5211-23 12:56:22.740: D/Process(10276): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
5311-23 12:56:22.750: D/Process(10276): dalvik.system.NativeStart.main(Native Method)
5411-23 12:56:22.760: I/Process(10276): Sending signal. PID: 10276 SIG: 9

@Mac Systems: Tut mir leid aber ich versteh leider nicht genau was gewünscht ist, bzw. wie ich das (z.B. die Exceptions) auslesen kann.

— geändert am 23.11.2013 13:42:32

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.207

23.11.2013 14:22:53 via Website

1. Irgendwo ist Network on Main ( Ist die Zeile 39 der Client Mainactivity)
2. Höstwarscheinlich kannst du auf den Server nicht zugreifen
3. Wo ist der server?
Gleiches Gerät (Ergibt keinen Sinn)
Anderes Gerät?
Oder auf dem PC?
Beschreibe deine Logik genauer

4. Füg mal in den TryCatch Block der MainActivity eine normale Exception ein, etwas so:

1try {
2 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
3 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
4} catch (UnknownHostException e1) {
5 e1.printStackTrace();
6 } catch (Exception e1) {
7 e1.printStackTrace();
8 }

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 1.727

23.11.2013 14:33:43 via Website

Na dein Code hat viele Probleme, UI und IO Code direkt miteinander zu verbinden ist mehr als nur unklug. Dafür gibt es Services.
Android bietet mitteks: Log.e(xx,xx,xx); die möglichkeit fehler besser loggen zu können.

Dein Code geht davon aus das alles gut geht, IMMER! Das ist aber gerade Mobile mal so garnicht der Fall, der User betritt den Fahrstuhl, und eine Connection ist erstmal weg.

Du hast typischen Gut-Fall Code geschrieben:

1try {
2 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
3 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
4 } catch (UnknownHostException e1) {
5 e1.printStackTrace();
6 } catch (IOException e1) {
7 e1.printStackTrace();
8 }

Du fängst zwar den Fehler in einer solchen situation, aber auch nur weil der Compiler dich dazu auffordert, mehr aber auch nicht, danach machst du einfach weiter, dabei sind ja schon Grundlegende Dinge schief gegangen. Das ist so als ob du am Auto zwar siehst das keine Reifen dran sind versuchst aber dennoch los zu fahren. Da du schreibst du hast "standart" code benutzt, nun ja, ich gehe mal davon aus du hast etwas Java erfahrung. Mit ein wenig Refactoring kann man diesen Code recht fehler unanfällig machen. Hierbei ist das Zerlegen in kleinere Methoden z.b angebracht die parameter übergeben bekommen und man sich somit auch viele variablen auf Klassen ebene erspart. Das
führt zum einen dazu das man sich nicht mehr überlegen muss wann welche variable zu welchen Zeitpunkt z.b einer Activity angesprochen werden darf.

Aber wir scheifen etwas vom Thema ab :bashful:

Jetzt kommt sicher ein Einwand das das ganze ja eh nur ein versuch ist ... ich habe sowas zu oft gehört und der Code bleibt wie er ist, nähmlich scheiße
und rottet weiter im Projekt vor sich hin.


Weiterhin steht in deinem StackTrace das genau die enkopplung von IO und UI Code nicht gegeben ist:

111-23 12:39:04.476: E/AndroidRuntime(627): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.server/com.example.server.MyClient}: android.os.NetworkOnMainThreadException

Android ist da sehr strikt, da der UI Thread das ganze User Interface am "leben" hält darfst du auf ihm kein IO machen!


hth,
Mac

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

  • Forum-Beiträge: 304

24.11.2013 05:24:53 via Website

Alles was mit Connections zu tun hat in einen seperaten Thread.

Ideal für sowas sind z.B. AsyncTasks