2014-10-05 3 views
1

Я пытаюсь создать очень основное сетевое приложение, которое будет подключаться к Google через сокет и отправлять «GET» и печатать вывод в текстовом виде. но кажется, что сокет никогда не соединяется ... что я делаю неправильно?Android Socket Programming Socket никогда не подключается

здесь код

MainActiviy:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import java.io.*; 
import java.net.*; 

public class MainActivity extends Activity { 

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

     TextView tva = (TextView) this.findViewById(R.id.tv); 
     String str = ""; 


     try { 
      Socket sock = new Socket("www.google.com", 80); 

      str = sock.getRemoteSocketAddress().toString(); 

      tva.setText("Connected to: " + str); 

      DataOutputStream out = new DataOutputStream(sock.getOutputStream()); 
      out.writeUTF("GET //"); 

      BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      str = br.readLine(); 

      while(str != null) { 
       tva.setText(str); 
       str = br.readLine(); 
      } 

      out.close(); 
      br.close(); 
      sock.close(); 

     } catch(Exception ex) { 

     } 
    } 
} 

манифеста:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.onik.netw" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="19" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.onik.netw.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

ответ

1

вы пытаетесь использовать сокеты на главном потоке пользовательского интерфейса, вы получите исключение android.os.NetworkOnMainThreadException

Переместите блок try {} в отдельный поток. Поскольку это будет работать в потоке, отличном от UI, вы не можете получить доступ к элементам пользовательского интерфейса, поэтому вам необходимо передать данные обратно в основной поток через обработчик, чтобы он мог отображать полученные данные.

Для быстрой проверки, заключите, что весь блок TRY внутри анонимной нить

new Thread() { 
    public void run() { 
    // your try block goes here  
    } 
}.start(); 

заменить tva.setText с Log.d("test", str)