2013-02-24 2 views
1

이것은 간단한 클라이언트 - 서버 안드로이드 응용 프로그램입니다. 서버는 로컬 PC에서 실행되는 간단한 Java 서버이며 클라이언트는 에뮬레이터에서 실행 중입니다. 여기에 클라이언트의 코드는 다음과 같습니다 지시 sock = new Socket("10.0.2.2", 12344);가 실행되지 않는 이유안드로이드 응용 프로그램 시작 소켓이 작동하지 않습니다.

package com.example.streamer; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

import java.io.BufferedReader; 

import java.io.BufferedWriter; 

import java.io.IOException; 

import java.io.InputStreamReader; 

import java.io.OutputStreamWriter; 

import java.net.Socket; 

class Connecting implements Runnable 
{ 
    private Socket sock; 

    private BufferedReader r; 

    private BufferedWriter out; 
    public Connecting() 
    { 
     Thread th = new Thread(this); 
     th.start(); 

    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     try 
     { 
      System.out.println("************************ trying to initiated *****************"); 
     sock = new Socket("10.0.2.2",12344); 

     System.out.println("************************ socket initiated *****************"); 

     r = new BufferedReader(new InputStreamReader(sock.getInputStream())); 

     System.out.println("************************ buffer reader initiated *****************"); 

     out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 

     System.out.println("************************ buffer writer initiated *****************"); 

     } 

     catch (IOException ioe) { } 


    } 

} 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 





    @Override 

    public void onResume() { 

     super.onResume(); 

     System.out.println("************************ on resume *****************"); 
     Connecting c = new Connecting(); 

    } 



} 

누구 아는 사람?

답변

1

문제는 응용 프로그램 권한을 올바르게 설정하지 않은 것과 관련이 있습니다.

다른 것들 중에서도 응용 프로그램이 요청할 권한이 포함 된 AndroidManifest.xml 파일을 편집해야합니다. 이 같은

파일을 편집 :

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.app.myapp" > 
    <uses-permission android:name="android.permission.INTERNET" /> 
    ... 
</manifest> 

라인 <uses-permission android:name="android.permission.INTERNET" />은 응용 프로그램이 인터넷에 연결하기 위해 허가를 요청 할 것입니다.

1

이 명령은 소켓을 외부 호스트에 연결하려고합니다. 그것은 오랜 시간이 걸릴 수 있습니다. 안드로이드의 많은 버전에서는 메인 쓰레드에서 네트워킹 호출을하지 않기 때문에 충돌이 일어날 것입니다. AsyncTask 또는 스레드로 이동하십시오.

+0

다른 도움말 PLZ의 코멘트 ...

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

는 지금 작동 매니페스트 파일에이 두 가지 조건을 추가 . 위의 코드를 편집했습니다. –

0

내가 자신의 클래스에 대한 연결을 이동하고 스레드에서 실행했다

관련 문제