2012-04-19 97 views
3

那么,我正在试图制作一个应用程序,该应用程序与我已设置,测试并在简单的Java应用程序的后台工作的套接字进行通信。应用程序强制在启动时关闭

问题是,我的应用程序保持马上关闭。 fcs之前你没有机会看到任何东西。

这是我的代码:

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 
import java.util.Scanner; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.Toast; 

public class LogMeInClientActivity extends Activity { 
    private Socket s; 
    private InetAddress hostIp, localIp; 
    private final String hostName = "localhost"; 
    private final int port = 4000; 
    private Scanner in; 
    private PrintWriter out; 
    private final EditText usernameField = (EditText)  findViewById(R.id.username_field), 
      passwordField = (EditText) findViewById(R.id.password_field); 
    private String username, password; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("A"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     System.out.println("B"); 
     try { 
      hostIp = InetAddress.getByName(hostName); 
      localIp = InetAddress.getLocalHost(); 
      System.out.println("Local Ip: " + localIp.toString()); 
      System.out.println("Host Ip: " + hostIp.toString()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     try { 
      s = new Socket(hostIp, port); 
      out = new PrintWriter(s.getOutputStream(), true); 
      in = new Scanner(s.getInputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class SignInButtonListener implements OnClickListener { 

     public void onClick(View clickedButton) { 
      switch (clickedButton.getId()) { 
      case R.id.sign_in: 
       username = usernameField.getText().toString(); 
       password = passwordField.getText().toString(); 
       if (username.length() != 0 && password.length() != 0) { 
        out.println(username); 
        out.println(password); 
       } 
       out.flush(); 
       break; 

      default: 
       break; 
      } 
     } 
    } 
} 

在上面的代码中,既不是 “A” 或 “B” 打印出来。应用程序只是fc的。

这里是我的清单:

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

    <uses-sdk android:minSdkVersion="15" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".LogMeInClientActivity" 
      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> 

</manifest> 

我用了上面的权限,因为我听到这将有助于它。

我更新的代码来解决了的EditText NullPointerException异常修复(只改部分):下面

private EditText usernameField, passwordField; 
public void onCreate(Bundle savedInstanceState) { 
     System.out.println("A"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     usernameField = (EditText) findViewById(R.id.username_field); 
     passwordField = (EditText) findViewById(R.id.password_field); 
     System.out.println("B"); 
     try { 
        // It's saying one of the errors are on line 37 (directly below) 
      hostIp = InetAddress.getByName(hostName); 
      localIp = InetAddress.getLocalHost(); 
      System.out.println("Local Ip: " + localIp.toString()); 
      System.out.println("Host Ip: " + hostIp.toString()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     try { 
      s = new Socket(hostIp, port); 
      out = new PrintWriter(s.getOutputStream(), true); 
      in = new Scanner(s.getInputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

新的logcat:

04-19 02:46:56.292: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.049: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:57.103: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.450: E/dalvikvm(1289): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 
04-19 02:46:57.462: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.669: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:58.069: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:58.409: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:58.650: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:58.779: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:59.009: I/System.out(1289): A 
04-19 02:46:59.153: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:59.321: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:59.639: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:59.879: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:00.249: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:00.490: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:00.819: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:00.970: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:01.279: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:01.477: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:01.791: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:01.919: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:02.302: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:02.443: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:02.811: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:02.999: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:03.409: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:03.583: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:03.870: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:04.029: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:04.410: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:04.529: I/System.out(1289): B 
04-19 02:47:04.603: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:04.850: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:05.020: D/AndroidRuntime(1289): Shutting down VM 
04-19 02:47:05.020: W/dalvikvm(1289): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
04-19 02:47:05.101: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:05.460: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:05.510: E/AndroidRuntime(1289): FATAL EXCEPTION: main 
04-19 02:47:05.510: E/AndroidRuntime(1289): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chriswins2much.Util/com.chriswins2much.Util.LogMeInClientActivity}: android.os.NetworkOnMainThreadException 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.Looper.loop(Looper.java:137) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at dalvik.system.NativeStart.main(Native Method) 
04-19 02:47:05.510: E/AndroidRuntime(1289): Caused by: android.os.NetworkOnMainThreadException 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.getByName(InetAddress.java:295) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.chriswins2much.Util.LogMeInClientActivity.onCreate(LogMeInClientActivity.java:37) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.Activity.performCreate(Activity.java:4465) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  ... 11 more 
04-19 02:47:05.779: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:06.839: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:07.000: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 

! 注意:这是一个新的,新的更新代码。部队关闭是固定的!谢谢你idiottiger! 虽然仍然存在问题。它没有连接到我在java中设置localhost:4000的端口。我试过非Android,它工作正常。这里是我的代码来解决力闭合:

public void onCreate(View v){ 
    // Code... 
     new Thread(new Runnable() { 
      public void run(){ 
       try { 
        hostIp = InetAddress.getByName(hostName); 
        localIp = InetAddress.getLocalHost(); 
        System.out.println("Local Ip: " + localIp.toString()); 
        System.out.println("Host Ip: " + hostIp.toString()); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } 
       try { 
        s = new Socket(hostIp, port); 
        out = new PrintWriter(s.getOutputStream(), true); 
        in = new Scanner(s.getInputStream()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 


} 

低于新的logcat(它的后半期):

04-19 03:38:02.920: I/System.out(1490): Local Ip: localhost/127.0.0.1 
04-19 03:38:03.099: I/System.out(1490): Host Ip: localhost/127.0.0.1 
04-19 03:38:05.420: W/System.err(1490): java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 4000): connect failed: ECONNREFUSED (Connection refused) 
04-19 03:38:05.711: W/System.err(1490):  at libcore.io.IoBridge.connect(IoBridge.java:114) 
04-19 03:38:05.711: W/System.err(1490):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
04-19 03:38:05.781: W/System.err(1490):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
04-19 03:38:05.781: W/System.err(1490):  at java.net.Socket.startupSocket(Socket.java:566) 
04-19 03:38:05.803: W/System.err(1490):  at java.net.Socket.<init>(Socket.java:225) 
04-19 03:38:05.809: W/System.err(1490):  at com.chriswins2much.Util.LogMeInClientActivity$1.run(LogMeInClientActivity.java:48) 
04-19 03:38:05.839: W/System.err(1490):  at java.lang.Thread.run(Thread.java:856) 
04-19 03:38:05.859: W/System.err(1490): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused) 
04-19 03:38:05.925: W/System.err(1490):  at libcore.io.Posix.connect(Native Method) 
04-19 03:38:05.939: W/System.err(1490):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
04-19 03:38:05.979: W/System.err(1490):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
04-19 03:38:05.979: W/System.err(1490):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
04-19 03:38:05.989: W/System.err(1490):  ... 6 more 
04-19 03:38:06.692: D/gralloc_goldfish(1490): Emulator without GPU emulation detected. 
+0

此行是导致错误: passwordField =(EditText上)findViewById(R.id.password_field);学习如何阅读堆栈跟踪,它会告诉你这个(即“由......引起”) – 2012-04-19 02:40:09

+0

它仍然没有工作,但是,我以前没有看到。预先感谢未来的问题,它可能会救我。 – chriswins2much 2012-04-19 03:07:10

+0

正在处理平板电脑应用程序NetworkOnMainThread异常将发生。尝试从另一个比ui线程area.Try访问http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception并在您的代码中添加严格模式。 – 2012-04-19 03:35:54

回答

16

好的......显然这是'localhost'的东西。 Android在另一个子网上运行,并为其自身保留127.0.0.1,所以当我试图连接到我在localhost:4000上设置的服务器时,我调用了Android的保留本地主机IP为127.0.0.1,而计算机的本地主机IP更改为10.0.2.2在端口4000上。

此修复程序是否实施?原因很简单:

我改变了这种

private final String hostName = "localhost"; 

这个

private final String hostName = "10.0.2.2"; 

或者,如果我有它试图在我的IP地址(而不是本地主机之一),那么它应该有工作,以及。

0

这些代码可能是有一些问题:

private final EditText usernameField = (EditText) findViewById(R.id.username_field), 
      passwordField = (EditText) findViewById(R.id.password_field); 

该视图需要初始化后setContentView,所以更改为:

private EditText usernameField,passwordField; 
setContentView

添加如下代码:

usernameField = (EditText) findViewById(R.id.username_field), 
passwordField = (EditText) findViewById(R.id.password_field); 

,如果它不能修复您的问题,您需要检查视图id:R.id.username_fieldR.id.password_field存在于你的main.xml文件或没有。

更新:

你新的错误:NetworkOnMainThreadException

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

像你InetAddress.getByName需要阻止main thread,所以尽量在另一个线程使用,或者改变SDK的目标版本低,如:< 11(android 3.0)

此外,您需要在您的xml中添加网络权限:

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

它仍然在发生! D: – chriswins2much 2012-04-19 02:49:34

+0

您是否可以使用新代码进行更新并粘贴新的错误消息? – idiottiger 2012-04-19 02:50:47

+0

谢谢。我现在正在尝试。 – chriswins2much 2012-04-19 03:37:50

0

我认为你正在使用与互联网相关的东西。我没有看到你的清单文件的权限。

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

我将它添加到清单,但它仍然给我相同的确切logcat thingy。我的意思完全相同。 – chriswins2much 2012-04-19 03:18:22

+0

我认为这是行37的事情,但我不知道 – chriswins2much 2012-04-19 03:20:00

+0

哦对不起。它的权限没有权限 – 2012-04-19 03:21:31

0

你的问题是AndroidManifest.xml中

如果你改变了
使用-SDK安卓的minSdkVersion = “15” 来使用-SDK安卓的minSdkVersion = “8” 程序就可以了。

我不知道这样