Client Android Studio

0

Witam wszystkich, piszę tutaj ponieważ natrafiłem na problem w programowaniu w języku java androida. Używam do tego android studio. Mam za zadanie stworzyć klienta na androidzie. I tutaj właśnie jest sprawa, w której piszę, client nie działa, jestem już trochę zdesperowany ponieważ nie mam pomyslu dlaczego, zawsze kiedy próbuje się połączyć z telefonu wywala mi błąd. Jako serwer na windows 7 pobrałem gotową aplikację TcpClientServer. Ustawiłem pozwolenie na internet w androidzie, podłączam do tej samej sieci telefon co laptopa... Poniżej zamieszczam kod fragmenty kodu które używam:

public void przycisk(View view) {
        try {
            ip = (EditText) findViewById(R.id.ip);
            port = (EditText) findViewById(R.id.port);

            InetAddress inetaddress = InetAddress.getByName("192.168.137.168");//(ip.getText().toString().getBytes());
            //inetsocketaddress = new InetSocketAddress(ip.getText().toString(), Integer.parseInt(port.getText().toString()));
            //inetsocketaddress = new InetSocketAddress("192.168.0.15",48569);
            //socket.connect(inetsocketaddress,2000);
            Socket socket = new Socket(inetaddress, 48569); //BŁĄD
            socket.setSoTimeout(2000);
            printwriter = new PrintWriter(socket.getOutputStream());
            printwriter.println(Float.toString(x1) + "+" + Float.toString(y1) + "+" + Float.toString(z1));
            printwriter.flush();
            printwriter.close();
            socket.close();
        } catch(IOException e)
        {   e.printStackTrace();
        }

    } 

pozwolenie na internet w manifeście:

<uses-permission android:name="android.permission.INTERNET" />

W kodzie są sposoby, którymi próbowałem już tworzyć socket jednak za każdym razem wyrzuca błąd w linijce Socket socket = new Socket(inetaddress, 48569);

Jeśli trzeba to mogę wrzucić cały projekt.
Pozdrawiam i dziękuje za pomoc :)

0
  1. Patrzałeś co Ci w logach pokazuje? Pisałeś że błąd leci ale nie podałeś jaka jest treść.
  2. Wydaje mi się że do wszelkiego rodzaju pobieranie danych przez sieć, powinieneś wywoływać asynchronicznie korzystając z rozszerzenia klasy AsyncTask.
0

jw. strzelam, że dostajesz NetworkOnMainThreadException, przenieś obsługę sieci do osobnego wątku (nie polecam AsyncTask, lepiej IntentService).

0

Logi:

05-26 17:47:30.732    4923-4923/com.example.bartek.projekt D/libc-netbsd﹕ [getaddrinfo]: hostname=xxxxx; servname=(null); cache_mode=(null), netid=0; mark=0
05-26 17:47:30.732    4923-4923/com.example.bartek.projekt D/libc-netbsd﹕ [getaddrinfo]: ai_addrlen=0; ai_canonname=xxxxx; ai_flags=4; ai_family=0
05-26 17:47:30.736    4923-4923/com.example.bartek.projekt D/AndroidRuntime﹕ Shutting down VM
05-26 17:47:30.744    4923-4923/com.example.bartek.projekt E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.bartek.projekt, PID: 4923
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4015)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5376)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4010)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5376)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
     Caused by: android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
            at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
            at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
            at libcore.io.IoBridge.connect(IoBridge.java:122)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
            at java.net.Socket.startupSocket(Socket.java:592)
            at java.net.Socket.<init>(Socket.java:228)
            at com.example.bartek.projekt.MainActivity.przycisk(MainActivity.java:91)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4010)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5376)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

Czyli mam to zrobić na dwóch wątkach tak? Wszystko z funkcji przycisk dać jako osobny? Generalnie problem może być naprawdę mały bo tą aplikację w androidzie robię z doskoku... Moja pierwsza w życiu styczność z java i androidem. Pozdrawiam i dziękuje za pomoc.

0

Dokładnie. Problem polega na tym, że realizujesz połączenie sieciowe w tym samym wątku co działa główna aktywnośc - a tego w Androidzie robić nie wolno.
Tutaj: http://andrzejklusiewicz-android.blogspot.com/2014/02/wielowatkowosc-w-androidzie.html masz to całkiem nieźle rozkminione. Wprawdzie nie dotyczy akurat łączenia po socketach, ale co do zasady powinieneś rozwiązać swój problem po zapoznaniu się z tym.

1

Działa na AsyncTask :-)
Bardzo dziękuje za pomoc, pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1