0

サーバークライアントモデルのAndroidプログラムを作成しました。私のPCはサーバーとして機能し、AVDはクライアントとして機能します。接続するサーバーのアドレスとして 10.0.2.2 を使用していますが、サーバー側は何も受信しません。クライアントが通常の Java プログラムの場合、私のサーバーは正常に動作します。クライアントが Android エミュレーターの場合に問題が発生します。私は非常に長い間この問題に取り組んできましたが、まだ解決策がありません。誰かが私を助けてくれることを願っています、ありがとう! 私のコード: サーバー:

import java.net.*;
import java.io.*;
public class Server {

    public static void main(String[] args) throws IOException{

        ServerSocket server = new ServerSocket(6002);
        while(true){
            Socket client = server.accept();
            BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream())); 
            System.out.println(in.readLine());
        }
    }
}

クライアント:

public class modules extends Activity {
    private ListView myListView;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.modules);
        myListView = (ListView)findViewById(R.id.listView1);

        Intent intent = getIntent();
        Bundle b = intent.getExtras();
        String semester = b.getString("semester");
        String subject = b.getString("subject");

        try {
            Socket socket = new Socket("10.0.2.2",6002);
            PrintWriter out=new PrintWriter(socket.getOutputStream(),true);  
            String s1 = "SEME" + semester;
            out.println(s1);
            out.flush();
            String s2 = "SUBJ" + subject;
            out.println(s2);
            out.flush();
            socket.close();

        } catch(UnknowHostException e) {
              e.printStackTrace();
        } catch(IOException e) {
               e.printStackTrace();
        }
    }
}

logcat には次のようなエラーがあります。

android.os.NetworkOnMainThreadException;

また、Strict モードのエラー:

07-22 14:24:24.892: E/AndroidRuntime(759):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099).

マニフェスト xml ファイルにユーザー権限を追加したので、問題は別のものに違いありません。

4

1 に答える 1

2

エラーの内容を確認してください: NetworkOnMainThreadException. これは、Android のメイン スレッドでネットワーク操作を行うべきではないことを意味します。リクエストがしばらく遅延すると、そのリクエストが完了するまでデバイスの応答がブロックされるためです。

Android で Socket クライアントを使用するには、AsyncTask、Thread、または Service を調べる必要があります。非常に簡単な AsyncTask を使用することをお勧めします。onCreate() メソッドにあるコードは、次のように AsyncTask を拡張する別のクラスに配置する必要があります。

public class YourAsyncTask extends AsyncTask<Void, Void, Void>
{
    protected Void doInBackground(Void... params)
    {
        //your socket code here...
    }
}

詳細については、AsyncTaskのドキュメントを確認するか、web/stackoverflow を参照して完全な例を確認してください。

これが役に立てば幸いです...さようなら。

于 2012-07-23T02:20:53.377 に答える