Connexion de socket client Java dans Android [dupliquer]


Cette question a déjà une réponse ici:

Je crée une connexion socket client entre mon ordinateur et Android.

Voici le code du serveur:

import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


class Server {
  public static void main(String[] args) {
    String ip = getIpAddress();

    if (ip != "false") {
        try {
            ServerSocket srvr = new ServerSocket(4444);

        Socket client = null;
        try {
            client = srvr.accept();

            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            System.out.print("Sending ip address: '" + ip + "'\n");
            out.print(ip);
            out.close();
            client.close();
            srvr.close();
        } catch(Exception e) {
            System.out.print(String.format("Accept failed: %s",e));
        }
        } catch (Exception e) {
            System.out.print(String.format("Could not listem on port: %s",e));
        }
    }
    else
    {
        System.out.print("Could not get ip address");
    }
  }

  public static String getIpAddress() {
    InetAddress host;
    String ipString = "false";

    try {
        host = InetAddress.getLocalHost();
        ipString = host.getHostAddress();
    } catch (UnknownHostException e) {
        System.out.println(e);
    }

    return ipString;
  }
}

Lorsque j'exécute le client sur l'ordinateur, tout fonctionne. Voici le code de l'ordinateur client:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class Client {
  public static void main(String[] args) {
    System.out.print(RunSocketClient());
  }

  public static String RunSocketClient() {
    try {
        Socket clnt = new Socket("localhost",4444);
        BufferedReader in = new BufferedReader(new InputStreamReader(clnt.getInputStream()));

        String fromServer;
        fromServer = in.readLine();

        return fromServer;
    } catch (IOException e) {
        return "nothing";
    }
  }
}

Lorsque j'exécute le code de ce client dans Android, le système cesse de fonctionner, quelle est l'erreur? Voici le code du client Android:

package com.example.clientapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout lView = new LinearLayout(this);

    TextView myText = new TextView(this);
    String ip = RunSocketClient();
    Log.d("ClientApp",ip);
    myText.setText(ip);

    lView.addView(myText);

    setContentView(lView);
  }

  public static String RunSocketClient() {
    try {
        Socket clnt = new Socket("localhost",4444);
        BufferedReader in = new BufferedReader(new InputStreamReader(clnt.getInputStream()));

        String fromServer;
        fromServer = in.readLine();

        return fromServer;
    } catch (IOException e) {
        return "nothing";
    }
  }
}

Voici le logcat du crash de l'application:

04-13 00:10:31.411: D/AndroidRuntime(13978): Shutting down VM

04-13 00:10:31.411: W/dalvikvm(13978): threadid=1: thread exiting with uncaught exception (group=0x410ab300)

04-13 00:10:31.411: E/AndroidRuntime(13978): FATAL EXCEPTION: main

04-13 00:10:31.411: E/AndroidRuntime(13978): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.clientapp/com.example.clientapp.MainActivity}: android.os.NetworkOnMainThreadException

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread.access$600(ActivityThread.java:130)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.os.Handler.dispatchMessage(Handler.java:99)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.os.Looper.loop(Looper.java:137)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread.main(ActivityThread.java:4745)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.lang.reflect.Method.invokeNative(Native Method)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.lang.reflect.Method.invoke(Method.java:511)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at dalvik.system.NativeStart.main(Native Method)

04-13 00:10:31.411: E/AndroidRuntime(13978): Caused by: android.os.NetworkOnMainThreadException

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.InetAddress.getAllByName(InetAddress.java:214)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.Socket.tryAllAddresses(Socket.java:108)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.Socket.<init>(Socket.java:177)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at java.net.Socket.<init>(Socket.java:149)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at com.example.clientapp.MainActivity.RunSocketClient(MainActivity.java:34)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at com.example.clientapp.MainActivity.onCreate(MainActivity.java:23)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.Activity.performCreate(Activity.java:5008)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)

04-13 00:10:31.411: E/AndroidRuntime(13978):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

04-13 00:10:31.411: E/AndroidRuntime(13978):    ... 11 more
Author: stinepike, 2013-04-13

2 answers

Dans votre application, l'exception NetworkOnMainThreadException est survenue. De la doc vous ca voir que

L'exception est levée lorsqu'une application tente d'effectuer une opération de mise en réseau sur son thread principal.

Vous devez donc appeler votre méthode RunSocketClient à partir d'un autre thread plutôt que du thread principal. Utilisez un gestionnaire ou asynctask ou un thread différent pour effectuer cette opération.

Pour connaître la bonne conception, vous pouvez voir ce lien

Http://developer.android.com/training/articles/perf-anr.html

 7
Author: stinepike, 2013-04-13 04:19:34

Ajoutez ces lignes à AndroidManifest.xml

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

Sans ces autorisations, vous ne pouvez pas accéder aux ressources réseau...

 -1
Author: serban.b, 2014-05-22 12:31:23