好吧,我正在尝试创建一个与我已经设置,测试过的套接字通信的应用程序,并在简单的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! 但是仍然存在问题。它没有连接到我在localhost:4000中设置的端口。我试过它非Android,它工作正常。这是我修复Force关闭的代码:
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 :(得分:16)
好的......显然这是'localhost'的事情。 Android在另一个子网上运行并为自己保留127.0.0.1,所以当我尝试连接到我在localhost:4000上设置的服务器时,我调用了Android的保留localhost ip为127.0.0.1,而计算机的localhost ip更改为10.0.2.2在端口4000上。
修复程序已实施?这很简单:
我改变了这个
private final String hostName = "localhost";
到这个
private final String hostName = "10.0.2.2";
或者,如果我尝试过我的IP地址(不是本地主机地址),那么它应该也能正常工作。
答案 1 :(得分: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);
如果无法解决您的问题,则需要检查您的R.id.username_field
文件中是否存在视图ID:R.id.password_field
和main.xml
。
更新
您遇到新错误:NetworkOnMainThreadException
仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。请参阅文档设计响应性。
就像你InetAddress.getByName
需要阻止main thread
一样,所以尝试在另一个线程中使用,或者将sdk目标版本更改为低,如:&lt; 11(android 3.0)
另外,您需要在xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
答案 2 :(得分:0)
我认为您正在使用与互联网相关的内容。我没有在你的清单文件中看到这个权限。
<uses-permission android:name="android.permissions.INTERNET" />
答案 3 :(得分:0)
你的问题是AndroidManifest.xml
如果你改变你的 使用-sdk android:minSdkVersion =“15”来使用-sdk android:minSdkVersion =“8” 程序还可以。
我不知道