2013-04-13 77 views
4

我在我的電腦和android之間創建客戶端套接字連接。Android中的Java客戶端套接字連接

這裏是服務器的代碼:

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客戶端代碼:

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 
+0

系統停止工作是什麼意思?應用程序崩潰了嗎?如果是的話請把logcat。 – stinepike

+0

是的應用程序崩潰。我把logcat放在問題中。 – aagarwal

回答

7

在您的應用程序發生NetworkOnMainThreadException。從文檔您可以看到

當應用程序嘗試在其主線程上執行 聯網操作時引發的異常。

所以你必須從另一個線程而不是主線程調用你的RunSocketClient方法。使用處理程序或async或者不同的線程來執行這個操作。

瞭解良好的設計,你可以看到這個鏈接

http://developer.android.com/training/articles/perf-anr.html

+0

謝謝。對此,我真的非常感激。 – aagarwal

+0

歡迎您..高興地看到你的問題解決了 – stinepike

-1

添加這些行的AndroidManifest.xml

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

沒有這些權限就無法訪問網絡資源...