Socket Client App verbindet sich nicht mit dem Server

  • Antworten:27
Peter Kurz
  • Forum-Beiträge: 14

25.11.2015, 18:17:52 via Website

Hallo Leute
Ich hab ein kleines Problem mit meinem Clientsocket.
-->der Serverteil funktioniert.

public void ClickConnect(View v)
{
Test.setText("click");
//Socket client;

    try
    {
        InetAddress IP = InetAddress.getByName("192.168.2.1");
        Socket client = new Socket(IP,8080);
        //PrintWriter out = new PrintWriter(client.getOutputStream(),true);
        //BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //out.write(Daten);
    }
    catch (UnknownHostException e)
    {
        Test.setText("Fail");
        //System.out.println("Unknown host : localhost");

    }
    catch(IOException e)
    {
        Test.setText("Fail2");
        //System.out.println("No I/O");
    }
}

Das ganze wird bei einem Knopfdruck ausgeführt.
Jedoch verbindet sich der Client nicht wie gewollt mit dem Server sonder geht immer in den Fail2 Pfad. Er kann in dem Fall den Server nicht finden, was wahrscheinlich an einer falschen Anwendung der IP Adresse liegen muss.

Kann mir vlt. jemand bei diesem Problem helfen?

Wünsche euch allen noch nen schönen Abend.

— geändert am 25.11.2015, 18:44:56

Antworten
Andy N.
  • Forum-Beiträge: 22.375

25.11.2015, 18:22:20 via Website

Hallo Peter

Herzlich willkommen bei uns im Forum :)

Bitte beachte, dass Threads mit nicht aussagekräftigem Titel bei uns üblicherweise den Regeln entsprechend entfernt werden. Ich bitte dich daher, deinen Threadtitel innerhalb der nächsten 24 Stunden, spätestens jedoch bei deinem nächsten Besuch noch etwas aussagekräftiger zu gestalten (Hierfür einfach unter deinem ersten Beitrag auf 'bearbeiten' klicken, dann kannst du oben noch mal den Titel anpassen)

Danke :)

Viele Grüße,
Andy


OnePlus 3 (Resurrection Remix 5.8.2)
LG G Watch

Regeln | unsere Mods & Admins

Peter Kurz

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

26.11.2015, 11:14:30 via Website

Hallo & herzlich willkommen,

Exceptions bitte nicht einfach fressen, sondern loggen und dann mit in die Problembeschreibung aufnehmen.

Ohne Exception müssen wir wild raten, was ich einfach mal tue:
Ist es sicher, dass dein Device die 192.168.2.1 sehen kann? Oder hängt es ggf. über eine mobile Datenverbindung in einem ganz anderen Netz?

VG
D. Zielke

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

26.11.2015, 15:19:20 via Website

Danke für die schnelle Antwort

Wenn ich auf dem Handy in der Internetadressleiste 192.168.2.1:8080 eingebe meldet der Socket-Server er habe erfolgreich verbinden können, daher nehme ich an, dass die Verbindung möglich sein müsste, ausser es wird im Handy für die App blockiert.

Kann es sein, das ich dem App zuerst noch Berechtigungen verteilen muss, damit es auf den Server zugreifen kann?

Was meinst du mit den Exceptions loggen?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.11.2015, 16:41:55 via App

Exceptions loggen geht mit Exception#printStackTrace()
Und dein Socketserver ist doch ein Http Server oder?
Wenn ja warum dann nicht direkt ne Http abfrage?
Oder brauchst du unbedingt ne TCP Verbindung

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

26.11.2015, 19:58:50 via Website

Nein ich glaube mein Serverprogramm braucht eine TCP-Verbindung.

int main( int argc, char *argv[] ) {
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;

/* First call to socket() function */
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}

/* Initialize socket structure */
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5001;

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

/* Now bind the host address using bind() call.*/
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}

/* Now start listening for the clients, here process will
* go in sleep mode and will wait for the incoming connection
*/

listen(sockfd,5);
clilen = sizeof(cli_addr);

/* Accept actual connection from the client */
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}

/* If connection is established then start communicating */
bzero(buffer,256);
n = read( newsockfd,buffer,255 );

if (n < 0) {
perror("ERROR reading from socket");
exit(1);
}

printf("Here is the message: %s\n",buffer);

/* Write a response to the client */
n = write(newsockfd,"I got your message",18);

if (n < 0) {
perror("ERROR writing to socket");
exit(1);
}

return 0;
}

Antworten
Peter Kurz
  • Forum-Beiträge: 14

26.11.2015, 20:01:06 via Website

Habe gerade noch bei Programm diese Rückmeldung gefunden, die das Handy zurückgibt und da steht was von "Permission denied"...

11-26 19:56:37.494 20760-20760/? I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
11-26 19:56:37.544 20760-20760/? I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
11-26 19:56:37.544 20760-20760/? D/libc-netbsd: [getaddrinfo]: hostname=xxxxx; servname=(null); cache_mode=(null), netid=0; mark=0
11-26 19:56:37.554 20760-20760/? D/libc-netbsd: [getaddrinfo]: ai_addrlen=0; ai_canonname=xxxxx; ai_flags=4; ai_family=0
11-26 19:56:37.554 20760-20760/? W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied)
11-26 19:56:37.554 20760-20760/? W/System.err: at libcore.io.IoBridge.socket(IoBridge.java:623)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.net.Socket.startupSocket(Socket.java:584)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.net.Socket.(Socket.java:228)
11-26 19:56:37.554 20760-20760/? W/System.err: at zenoheeb.autosteuerung.MainActivity.ClickConnect(MainActivity.java:67)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.view.View.performClick(View.java:4803)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.view.View$PerformClick.run(View.java:19981)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.os.Looper.loop(Looper.java:135)
11-26 19:56:37.554 20760-20760/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5430)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
11-26 19:56:37.554 20760-20760/? W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
11-26 19:56:37.554 20760-20760/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
11-26 19:56:37.554 20760-20760/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)
11-26 19:56:37.554 20760-20760/? W/System.err: Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
11-26 19:56:37.554 20760-20760/? W/System.err: at libcore.io.Posix.socket(Native Method)
11-26 19:56:37.554 20760-20760/? W/System.err: at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
11-26 19:56:37.554 20760-20760/? W/System.err: at libcore.io.IoBridge.socket(IoBridge.java:608)
11-26 19:56:37.554 20760-20760/? W/System.err: ... 17 more

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.11.2015, 20:42:54 via App

Hast du die Internet Permission gesetzt?

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

26.11.2015, 22:10:15 via Website

Nein ich denke nicht, habe den Code nun mit
uses-permission android:name="android.permission.INTERNET"/>
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

ergänz, aber jetzt stürzt das Programm beim Knopfdruck immer ab.

11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: FATAL EXCEPTION: main
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: Process: zenoheeb.autosteuerung, PID: 31682
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.performClick(View.java:4803)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19981)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5430)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.performClick(View.java:4803) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19981) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5430) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: Caused by: android.os.NetworkOnMainThreadException
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at libcore.io.IoBridge.connect(IoBridge.java:122)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.Socket.startupSocket(Socket.java:592)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.Socket.tryAllAddresses(Socket.java:130)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.Socket.(Socket.java:180)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.net.Socket.(Socket.java:152)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at zenoheeb.autosteuerung.MainActivity.ClickConnect(MainActivity.java:67)
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.performClick(View.java:4803) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19981) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5430) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) 
11-26 22:04:48.850 31682-31682/zenoheeb.autosteuerung E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 
11-26 22:04:50.320 31682-31682/zenoheeb.autosteuerung I/Process: Sending signal. PID: 31682 SIG: 9

Es kann die OnClick Methode nicht mehr finden...

— geändert am 26.11.2015, 22:11:48

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.11.2015, 06:57:03 via App

Falsch,
das hier ist der Fehler:

NetworkOnMainThreadException.
Das bedeutet du darfst Keine Netzwerkoperationsn im ManThread machen sondern musst dann einen neuen Thread/AsyncTask benutzen

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

29.11.2015, 10:13:22 via Website

Hab mich jetzt einmal ein bisschen in die Threads eingearbeitet und kam zu diesem Ergebnis, welches mir jedoch einen Fehler beim Thread meldet.

Neuer Code:

public void ClickConnect(View v)
{
new Thread(new Runnable() {

        //@Override
        public void run() {

            Test.setText("click");
            //Socket client;

            try
            {
                InetAddress IP = InetAddress.getByName("192.168.2.1");
                Socket client = new Socket("IP",8080);
                //PrintWriter out = new PrintWriter(client.getOutputStream(),true);
                //BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                //out.write(Daten);
            }
            catch (UnknownHostException e)
            {
                Test.setText("Fail");
                //System.out.println("Unknown host : localhost");

            }
            catch(IOException e)
            {
                Test.setText("Fail2");
                //System.out.println("No I/O");
            }
    /*catch(IOException ioe)
    {
        ioe.printStackTrace();
    }*/

        }  }).start();

}

Fehler:

11-29 10:07:17.625 10731-10731/zenoheeb.autosteuerung I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
11-29 10:07:17.655 10731-10731/zenoheeb.autosteuerung I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: FATAL EXCEPTION: Thread-3327
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: Process: zenoheeb.autosteuerung, PID: 10731
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6484)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:898)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:361)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:361)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.view.View.requestLayout(View.java:17562)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.TextView.checkForRelayout(TextView.java:7078)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.TextView.setText(TextView.java:4199)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.TextView.setText(TextView.java:4057)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at android.widget.TextView.setText(TextView.java:4012)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at zenoheeb.autosteuerung.MainActivity$1.run(MainActivity.java:67)
11-29 10:07:17.665 10731-10840/zenoheeb.autosteuerung E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
11-29 10:07:17.855 10731-10752/zenoheeb.autosteuerung D/OpenGLRenderer: endAllStagingAnimators on 0x7f9eb4a000 (RippleDrawable) with handle 0x7fa46d5b20
11-29 10:07:18.835 10731-10840/zenoheeb.autosteuerung I/Process: Sending signal. PID: 10731 SIG: 9

Kann mir jemand sagen, was ich falsch mache?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.11.2015, 10:34:48 via Website

Kann ich dir genau sagen:
Jetzt machst du zwar Threading, aber aus einem Thread darfst du keine UI Elemente verändern. Dies muss trotzdem im Main passieren.
Somit ist da der Fehler:
Test.setText("click"); // Natürlich alle anderen Aktionen mit der TextView auh...

Damit das nicht passiert musst du das setText im MainThread machen.
Das geht mit Activity#runOnUIThread().. In die zugehörige Runnable kommt dein sein setText code

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

29.11.2015, 11:13:02 via Website

Danke, mit deiner Hilfe konnte ich erstmals eine funktionierende Verbindung herstellen, jedoch kann ich keine Daten senden)es kommt nicht an) und ausserdem könnte ich so nur Daten schreiben, wenn ich in dieser Funktion bin und daher die Frage, kann ich den "Writer" auch irgendwie so definieren, dass ich auch bei einem anderen Knopf-Druck etwas senden kann und warum sendet es nichts?

-->ab und zu kommen ein paar Sonderzeichen an, aber erst nach ca. 1minute oder so.

— geändert am 29.11.2015, 11:23:23

Antworten
Peter Kurz
  • Forum-Beiträge: 14

29.11.2015, 11:43:49 via Website

Ich verstehe noch nicht ganz, warum mit diesem Code keine Nachricht geschickt wird...

out = new PrintWriter(client.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out.write("hallo");

— geändert am 29.11.2015, 11:51:06

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.11.2015, 11:55:42 via Website

ein out.write() reicht alleine naicht.
Darauf muss ein out.flush(); folgen

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

29.11.2015, 12:00:32 via Website

Ja jetzt kommen die Daten an!
Danke für Deine Hilfe, ich hoffe jetzt bring ich es zum laufen xD

— geändert am 29.11.2015, 12:08:31

Antworten
Peter Kurz
  • Forum-Beiträge: 14

13.03.2017, 19:14:37 via Website

Abend Leute

Ich bin zurzeit an einem neuen Projekt dran und brauche dafür eine Socketverbindung. Nach ein bischen suchen fand ich meine alte App wieder und passte diese leicht an, da ich au empfangen können möchte und nicht nur senden. Leider funktioniert das nur mangelhaft. Manchmal empfängt es die ersten Daten erfolgreich und kann mir diese auch in ein Textfeld ausgeben, jedoch spätestens nach ein paar durchläufen der while Schlaufe springt er wieder raus und empfängt dadurch auch nichts mehr. Das App jedoch läuft ohne Absturz weiter. Meine Ideen dazu tendieren in die Richtung, dass zu lange Daten oder Spezielle Zeichen ankommen, die nicht verkraftet werden.

--> Das Schicken funktioniert, also steht die Verbindung

Der Sender schickt ca. alle 20s einmal Daten
image

Hier das Handy App
public void ClickConnect(View v) {
Connectbutton = Connect.getText().toString();
if (Connectbutton.equalsIgnoreCase("Connect")) //Button Text ist Connect
{
new Thread(new Runnable() {

            @Override
            public void run() {

                //Socket client;
                try {
                    //InetAddress IP = InetAddress.getByName("192.168.2.1");
                    client = new Socket("192.168.2.1", 8080);
                    //Socket öffnen
                    out = new PrintWriter(client.getOutputStream(), true);
                    ///Writer öffnen
                    in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    //Reader öffnen
                    out.write("Verbindung OK");
                    out.flush();

                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            Connect.setText("Disconnect");      //Button auf Diconnect setzen
                            Ausschalten.setEnabled(true);
                            Set_PID.setEnabled(true);
                            Kalibration.setEnabled(true);
                            Information.setText(Data_read);
                        }
                    });

                    while(true)
                    {
                        Data_read = in.readLine();
                        if(Data_read != null)
                        {
                            runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                //Test.setText("Fail");
                                Information.setText(Data_read);
                            }
                        });
                        }

                    }


                } catch (UnknownHostException e) {              //Bei einem Fehler
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            //Test.setText("Fail");
                            Connect.setText("Connect");         //Button auf Connect setzen
                            Ausschalten.setEnabled(false);
                            Set_PID.setEnabled(false);
                            Kalibration.setEnabled(false);
                        }
                    });

                } catch (IOException e) {                         //Bei einem Fehler
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            //Test.setText("Fail2");
                            Connect.setText("Connect");         //Button auf Connect setzen
                            Ausschalten.setEnabled(false);
                            Set_PID.setEnabled(false);
                            Kalibration.setEnabled(false);
                        }
                    });
                }

            }
        }).start();

    } else if (Connectbutton.equalsIgnoreCase("Disconnect"))

und hier konnte es mal was empfangen
image

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.03.2017, 20:48:07 via Website

Hallo Peter,
ich halte deine aktuelle Struktur für wenig sinvoll.
Einen Thread auf einen Button-Click zu starten und darin alles behandeln - naja...

Ich würde es mit einer passenden Struktur in AsyncTasks+Callback etc. umsetzten:
https://github.com/codepath/android_guides/wiki/Sending-and-Receiving-Data-with-Sockets

Meine Ideen dazu tendieren in die Richtung, dass zu lange Daten oder Spezielle Zeichen ankommen, die nicht verkraftet werden.

Zu lange Daten - dann wird es auf mehrere TCP Pakete aufgeteilt, ist also kein Problem. Und Zeichen die nicht verkraftet werden, gibt es nicht zumindest auf TCP Sender/Empfänger ebene. Dass deine TextView mal was nicht anzeigen kann, das kann sein.
Ich würde erstmal komplett ohne UI elemente arbeiten und nur Log.d() benutzen. Da hat sich erstmal keinen Kopf mit runOnUIThread zu machen etc..

Und im besten Fall kommuniziert man nicht über Strings sondern über ein passendes Protokoll mit Checksummen etc. damit du weißt dass alles passt.

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

Peter Kurzpepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

15.03.2017, 08:38:10 via Website

Japp, Pascal hat es schon das wichtigste gesagt. Der AsyncTask ist hier die richtige Wahl. Am besten erstmal etwas einlesen und dann wird das Endergebnis gleich ein ganz anderes.
Vielleicht als kleine Ergänzung: So gesehen ist Log.d() aus Sicht der Thread-Behandlung nicht besser als die Ausgabe auf dem Device. Oder einfach gesagt: Blockierende Operationen sollten in Android immer aus dem Hintergrund gestartet werden (in dem Moment wo man auf den Button drückt blockiert schon MainUi - bzw. selbst wenn es keinen Button gibt startet man ohne den entsprechenden Handler immer aus dem Vordergrund).
... dass Log.d() "handlicher" zum Testen ist, denke ich auch.

Hier ein Link einem Projekt von mir, ich habe mir zwar fast jegliche Kommentierung gespart, aber dafür kann ich dir versichern, dass das Programm 100% zuverlässig sendet und empfängt.
https://github.com/pepperonas/Yahama/blob/master/app/src/main/java/com/pepperonas/yahama/app/MainActivity.java#L540

Open Source

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

31.03.2017, 11:02:16 via Website

Hallo

Zuerst mal danke für eure antworten.
Hab mich jetzt mal ein bisschen in den Asynctask eingelesen und sieht echt nach ner guten Lösung aus. Jetzt hab ich ein paar einfache Beispiele gefunden, in denen zum Beispiel in onPostExecute() direkt auf Elemente aus dem GUI zugegriffen wird. Dies funktioniert bei ir jedoch nicht ganz und daher die Frage ob ich was falsch mache, oder ob man noch einen Handler dazwischenschalten muss?

image

Antworten
swa00
  • Forum-Beiträge: 3.704

31.03.2017, 11:12:52 via Website

Hallo Peter,

wenn du auf Elemente im UI Thread zugreifen möchtest , dann musst du dies explizit tun.
Dies steht im übrigen in deinem AS ErrorLog, schau mal genau

mActivity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Connect.setText ("Connect");
}
});

P.S bitte beim nächsten male kein Screenshot für Code verwenden. Man muss dann alles abtippen :-)

— geändert am 31.03.2017, 11:13:33

Liebe Grüße - Stefan
[ App - Entwicklung ]

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

31.03.2017, 11:25:11 via Website

 MainActivity.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                Connect.setText ("Connect");
            }
        });

So hab ich das auch schon probiert, jedoch wird das runOnUiThread markiert(Non-static methode can not be referenced from a satic context) und Connect wird immer noch nicht erkannt.

Antworten
swa00
  • Forum-Beiträge: 3.704

31.03.2017, 11:50:01 via Website

Hallo Peter,

dein MainActivity ist nicht Statisch - so wie die Fehlermeldung.

Normalerweise arbeitet man ein wenig mehr OOP orientiert.

Man macht sich also eine eigene Klasse mit dem Thread, baut sich einen Constructor und übergibt diesem
die Instanz der MainActivity.
Diese Instanz ist dann eine private Variable der Klasse.

Deshalb habe ich auch Dies in meinem Beispiel explizit aufgeführt

Bsp
private Activity mActivity;

im Constructor
this.mActivity = (Übergabe Instanz via Parameter)

— geändert am 31.03.2017, 11:50:32

Liebe Grüße - Stefan
[ App - Entwicklung ]

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

31.03.2017, 18:33:41 via Website

Musste ein bisschen probieren mit dem Übergeben, doch jetzt hat es geklappt. Ein kleines Problem hätte ich jedoch und zwar muss ich mein char-Array in ein byte-Array wandeln, da die Funktion ein solches verlangt. Dies war auch kein Problem, jedoch will ich das Ganze jetzt gern wieder als String oder char-Array. Dabei wird meiner Meinung nach ein anderer Decoder verwendet, so das mein Text auf "Alien-Sprache" rauskommt. Diverse andere KOnvertierungsversuche scheiterten, vor allem weil ich dann immer die Rückmeldung bekam ich verwende ein Zweidimensional-Array was ich nicht wirklich nachvollziehen kann.

@Override
protected void onProgressUpdate(byte[]... value)
{
    if(value.length > 0)
    {
        //String test1 = new String(value, StandardCharsets.UTF_8);
        //String test2 = new String(value);
        char[] test = new char[value.length];
        test = value.toString().toCharArray();
        parentActivity.Information.setText(value.toString());
    }
}

image image

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.03.2017, 18:45:19 via App

Du musst wissen welches Charset du auf Sender seite benutzt. Dann geht das:
http://stackoverflow.com/a/1536123

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

Peter Kurz

Antworten
Peter Kurz
  • Forum-Beiträge: 14

31.03.2017, 19:22:03 via Website

tempdata = Charset.forName("UTF-8").encode(CharBuffer.wrap(buffer)).array(); --> Also UFT-8
Aber das funktioniert nicht, weil er da immer ein 2-dimensional array erkennt.
image

String test1 = new String(value, StandardCharsets.UTF_8);
String test3 = new String(value, "UTF-8");

Bei beiden Versionen der gleiche Fehler.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.03.2017, 20:40:26 via Website

In der Tat, schau mal auf deine Parameterdefinition:

byte[]... value

... -> Array wenn du jetzt byte[]... machst ist das wie byte[][] also ein 2D Array.
Wenn du das so definierst, musst du dich auch nicht wundern ;)

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

Peter Kurzswa00

Antworten