5

コンピューターと Android の間にクライアント ソケット接続を作成しています。

サーバーのコードは次のとおりです。

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;
  }
}

コンピューターでクライアントを実行すると、すべてが機能します。コンピューター クライアントのコードは次のとおりです。

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";
    }
  }
}

Android でこのクライアント コードを実行すると、システムが動作しなくなります。エラーは何ですか? 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";
    }
  }
}

アプリケーション クラッシュの logcat は次のとおりです。

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
4

2 に答える 2

-1

これらの行を AndroidManifest.xml に追加します

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

これらの権限がないと、ネットワーク リソースにアクセスできません...

于 2014-05-22T12:31:23.210 に答える