TCP Client - Socketprobleme

  • Antworten:7
Kevin D.
  • Forum-Beiträge: 5

08.04.2013, 11:08:32 via Website

Hallo liebe Community,

ich bin neu hier und dachte ihr könntet mir wohl helfen. Ich versuche derzeit für meine Bachelorarbeit eine kleine App zu entwicklen, mit der ich Daten an eine Allen Bradley SPS schicken kann. Deswegen habe ich mir die von Java bereitgestellten Sockets einmal näher angeschaut. Folgende Codezeilen stehen bereits:
1package com.example.clientsocket;
2
3
4import java.io.*;
5import java.net.*;
6import android.widget.*;
7import android.app.Activity;
8import android.os.Bundle;
9import android.text.Editable;
10import android.view.View;
11
12public class MainActivity extends Activity {
13Socket clientSocket;
14
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 Thread thread = new Thread();
20 thread.start();
21 setContentView(R.layout.activity_main);
22 }
23
24 public void Start(View view){
25
26 //Variablendeklaration
27 TextView info = (TextView)findViewById(R.id.textView1);
28 EditText ip = (EditText)findViewById(R.id.editText1);
29 Editable ipneu = ip.getText();
30 //String ipadr = ipneu.toString();
31 EditText port = (EditText)findViewById(R.id.editText2);
32 Editable portneu = port.getText();
33 int portadr = Integer.parseInt(portneu.toString());
34 EditText content = (EditText)findViewById(R.id.editText3);
35 Editable contentneu = content.getText();
36 //Socket erstellen
37 Socket clientSocket = null;
38 DataOutputStream os = null;
39 DataInputStream is = null;
40 DataInputStream stdln = new DataInputStream(System.in);
41
42 try{
43 clientSocket = new Socket("127.0.0.1", 8888);
44 os = new DataOutputStream(clientSocket.getOutputStream());
45 is = new DataInputStream(clientSocket.getInputStream());
46 } catch (UnknownHostException e){
47 e.printStackTrace();
48 } catch (IOException e){
49 e.printStackTrace();
50 }
51
52 //Ausgabe der eingegebenen Werte
53 info.setText("IP-Adresse: " + ipneu + "\n Port: " + portneu + "\n Inhalt: " + contentneu);
54
55 }
56
57}

Leider bekomme ich sobald ich den clientSocket einbinde immer eine Fehlermeldung im LogCat:
104-08 08:46:14.042: I/Process(668): Sending signal. PID: 668 SIG: 9
204-08 08:46:16.933: D/gralloc_goldfish(683): Emulator without GPU emulation detected.
304-08 08:46:21.984: D/AndroidRuntime(683): Shutting down VM
404-08 08:46:21.984: W/dalvikvm(683): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
504-08 08:46:22.034: E/AndroidRuntime(683): FATAL EXCEPTION: main
604-08 08:46:22.034: E/AndroidRuntime(683): java.lang.IllegalStateException: Could not execute method of the activity
704-08 08:46:22.034: E/AndroidRuntime(683): at android.view.View$1.onClick(View.java:3039)
804-08 08:46:22.034: E/AndroidRuntime(683): at android.view.View.performClick(View.java:3480)
904-08 08:46:22.034: E/AndroidRuntime(683): at android.view.View$PerformClick.run(View.java:13983)
1004-08 08:46:22.034: E/AndroidRuntime(683): at android.os.Handler.handleCallback(Handler.java:605)
1104-08 08:46:22.034: E/AndroidRuntime(683): at android.os.Handler.dispatchMessage(Handler.java:92)
1204-08 08:46:22.034: E/AndroidRuntime(683): at android.os.Looper.loop(Looper.java:137)
1304-08 08:46:22.034: E/AndroidRuntime(683): at android.app.ActivityThread.main(ActivityThread.java:4340)
1404-08 08:46:22.034: E/AndroidRuntime(683): at java.lang.reflect.Method.invokeNative(Native Method)
1504-08 08:46:22.034: E/AndroidRuntime(683): at java.lang.reflect.Method.invoke(Method.java:511)
1604-08 08:46:22.034: E/AndroidRuntime(683): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
1704-08 08:46:22.034: E/AndroidRuntime(683): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
1804-08 08:46:22.034: E/AndroidRuntime(683): at dalvik.system.NativeStart.main(Native Method)
1904-08 08:46:22.034: E/AndroidRuntime(683): Caused by: java.lang.reflect.InvocationTargetException
2004-08 08:46:22.034: E/AndroidRuntime(683): at java.lang.reflect.Method.invokeNative(Native Method)
2104-08 08:46:22.034: E/AndroidRuntime(683): at java.lang.reflect.Method.invoke(Method.java:511)
2204-08 08:46:22.034: E/AndroidRuntime(683): at android.view.View$1.onClick(View.java:3034)
2304-08 08:46:22.034: E/AndroidRuntime(683): ... 11 more
2404-08 08:46:22.034: E/AndroidRuntime(683): Caused by: android.os.NetworkOnMainThreadException
2504-08 08:46:22.034: E/AndroidRuntime(683): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
2604-08 08:46:22.034: E/AndroidRuntime(683): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74)
2704-08 08:46:22.034: E/AndroidRuntime(683): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
2804-08 08:46:22.034: E/AndroidRuntime(683): at libcore.io.IoBridge.connect(IoBridge.java:112)
2904-08 08:46:22.034: E/AndroidRuntime(683): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
3004-08 08:46:22.034: E/AndroidRuntime(683): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
3104-08 08:46:22.034: E/AndroidRuntime(683): at java.net.Socket.startupSocket(Socket.java:566)
3204-08 08:46:22.034: E/AndroidRuntime(683): at java.net.Socket.tryAllAddresses(Socket.java:127)
3304-08 08:46:22.034: E/AndroidRuntime(683): at java.net.Socket.<init>(Socket.java:177)
3404-08 08:46:22.034: E/AndroidRuntime(683): at java.net.Socket.<init>(Socket.java:149)
3504-08 08:46:22.034: E/AndroidRuntime(683): at com.example.clientsocket.MainActivity.Start(MainActivity.java:43)
3604-08 08:46:22.034: E/AndroidRuntime(683): ... 14 more
3704-08 08:46:30.513: I/Process(683): Sending signal. PID: 683 SIG: 9
.

Ich bitte um konstruktive Ratschläge...

Mit freundlichen Grüßen,

euer Kevin

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

08.04.2013, 11:27:29 via Website

Das tolle an StackTraces ist ja, dass der Fehler idR immer sehr offensichtlich drin steht.

104-08 08:46:22.034: E/AndroidRuntime(683): Caused by: android.os.NetworkOnMainThreadException

Google einfach nach NetworkOnMainThreadException und Du findest deine Lösung.

Antworten
Kevin D.
  • Forum-Beiträge: 5

08.04.2013, 12:33:24 via Website

Vielen Dank, Rafael.

Nun habe ich den Thread richtig eingebunden und es kamp prompt die nächste Fehlermeldung. Wie kann ich jetzt einen Handler richtig einbauen, damit der Main-Thread wieder die UI bearbeiten kann?

104-08 10:13:25.065: E/AndroidRuntime(771): FATAL EXCEPTION: Thread-93
204-08 10:13:25.065: E/AndroidRuntime(771): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

08.04.2013, 12:51:16 via Website

Auch hier einfach nach der Fehlermeldung (in Anführungszeichen) googlen.
Die Probleme hatten schon hunderte vor dir :)

https://www.google.com/search?q=%22Only+the+original+thread+that+created+a+view+hierarchy+can+touch+its+views%22&hl=de

Erster Treffer

Antworten
Kevin D.
  • Forum-Beiträge: 5

08.04.2013, 13:20:50 via Website

Ja, da war ich doch etwas voreilig. Tut mir echt Leid. Ich habe mir ein Beispiel heruntergeladen und es angewendet. Jetzt kommt der letzte Feinschliff.
Vielen Dank :)

Antworten
Kevin D.
  • Forum-Beiträge: 5

10.04.2013, 07:32:20 via Website

Noch mal eine Frage: Gibt es die Möglichkeit diesen Client ohne laufenden Java-Server auszuführen bzw. eine Datenübertragung zu starten?
Mein Ziel ist es, ein Datenpaket an die Steuerung zu schicken. Auf dieser Steuerung kann jedoch kein Java-Server gestartet werden.

Antworten
Michael H
  • Forum-Beiträge: 127

10.04.2013, 08:33:41 via Website

Nein meiner Meinung nach nicht. Da würde ja der Socketaufbau bereits meckern und wo willst du diesen überhaupt hinsenden, wenn kein Host vorhanden ist?

Antworten
Kevin D.
  • Forum-Beiträge: 5

10.04.2013, 11:54:07 via Website

Hmm meckern tut er nicht... ich hatte versucht das Handy in die Hardwarekonfiguration des Programmes mit aufzunehmen. Hat leider nicht funktioniert. Gibt es denn keine Möglichkeit sich ein Programm zu schreiben, welches ein Datenpaket (wie Ping) an eine bestimmte IP-Adresse über Ethernet zu schicken?

Antworten