2014-10-05 246 views
1

我想創建非常基本的網絡應用程序,它將通過套接字連接到谷歌,併發送「GET」並在文本視圖中輸出輸出。但看起來,套接字永遠不會連接...我做錯了什麼?Android套接字編程套接字永不連接

這裏是代碼

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

你要使用的主UI線程插座,你會得到異常android.os.NetworkOnMainThreadException

將try {}塊移到單獨的線程中。由於這將在非UI線程上運行,因此無法訪問UI元素,因此需要將數據傳回主線程可能是通過Handler,因此它可以顯示收到的數據。

對於一個快速測試,括起整個try塊匿名線程內

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

Log.d("test", str)

更換 tva.setText