1

我对 android 和 java 编程很陌生,我需要你的帮助。我想在我的 PC (Windows 7) 上创建一个 Android 客户端和一个服务器。我用 putty(一个模仿客户端的程序(没有编程错误^^))检查了我的服务器是否编程没有错误。因此我认识到我的服务器编程正确。

在这里你可以看到我运行良好的服务器:

  public class MyServer {
  public static void main (String[] args) throws IOException {

  ServerSocket serverSocket = null;

  try {
      serverSocket = new ServerSocket(4449);
      System.out.println("Listening on port: 4449");
  } catch (IOException e){
      System.err.println("Could not listen on port 4449.");
      System.exit(1);
  }

  Socket clientSocket = null;

  try {
      clientSocket = serverSocket.accept();
   System.out.println("Got connection.");
  } catch (IOException e) {
      System.err.println("Accept failed: 4449.");
      System.exit(1);
  }

  BufferedReader in = null;
  PrintWriter out = null;
  try {
      in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

      out = new PrintWriter(clientSocket.getOutputStream(), true);
  } catch (IOException e) {
      System.err.println("Read failed");
      e.printStackTrace();
  }


  try {

      System.out.println("message: " + in.readLine());
      out.println("hab was bekommen!");
  } catch (IOException e) {
      System.err.println("Can't get a message from Client.");
      e.printStackTrace();

  }
  }
  }

我还尝试为此服务器创建一个 Android 客户端,但我没有管理它。

这是我的主要活动:

public class AndroidClient extends Activity {

EditText textOut;
TextView textIn;
TextView problems;

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

    textOut = (EditText)findViewById(R.id.textout);
    Button buttonSend = (Button)findViewById(R.id.send);
    textIn = (TextView)findViewById(R.id.textin);
    problems = (TextView)findViewById(R.id.problems);
    buttonSend.setOnClickListener(buttonSendOnClickListener);
}

Button.OnClickListener buttonSendOnClickListener 
= new Button.OnClickListener() {


    @Override
    public void onClick(View arg0) {
        //TODO Auto-generated method stub
        Socket client = null;


        BufferedReader in = null;
        PrintWriter out = null;

        try {
            client = new Socket("192.168.2.107", 4449);
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
        } catch (UnknownHostException e) {
            problems.setText("Unknown host: 192.168.2.107");
        } catch (IOException e) {
            // System.out.println("No Input/Output.");
            problems.setText("No Input/Output.");
        }

        try {
            out.println("Hallo.");
            textIn.setText(in.readLine());
        } catch (IOException e) {
            problems.setText("Can't send/ get message.");
        }
    }   
};



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_android_client, menu);
    return true;
}
    }

到现在为止还挺好。当我在我的 android 智能手机上启动我的应用程序时,应用程序启动没有任何问题。然后我在我的 EditText 字段“textOut”中输入一些内容并按下“发送”按钮。然后我的屏幕变黑,应用程序自行关闭。我还在 AndroidManifest.xml 中粘贴了进入互联网和使用访问 Wifi 的权限。

我希望有人可以帮助我,因为我在这个问题上工作了 2 天,还没有找到任何解决方案。我主要使用这方面(http://android-er.blogspot.de/2011/01/simple-communication-using.html),当然还有其他方面,但我得到了大部分信息。此外,我的源代码中没有显示错误。

亲切的问候,

卢卡斯5060

编辑:这是我的 LogCat:

12-28 20:21:55.929: I/dalvikvm(698): threadid=3: 对信号 3 做出反应 12-28 20:21:56.039: I/dalvikvm(698): 将堆栈跟踪写入 '/data/anr/ traces.txt' 12-28 20:21:56.259: I/dalvikvm(698): threadid=3: 对信号 3 做出反应 12-28 20:21:56.299: I/dalvikvm(698): 将堆栈跟踪写入 '/ data/anr/traces.txt' 12-28 20:21:56.741: D/gralloc_goldfish(698): 没有检测到 GPU 仿真的仿真器。12-28 20:21:56.771: I/dalvikvm(698): threadid=3: 对信号 3 做出反应 12-28 20:21:56.789: I/dalvikvm(698): 将堆栈跟踪写入 '/data/anr/ traces.txt' 12-28 20:23:58.430: D/AndroidRuntime(698): 关闭 VM 12-28 20:23:58.430: W/dalvikvm(698): threadid=1: 线程退出未捕获异常(组= 0x409c01f8) 12-28 20:23:58.470: E/AndroidRuntime(698): 致命异常: main 12-28 20:23:58.470: E/AndroidRuntime(698): android.os。E/AndroidRuntime(698): at java.lang.reflect.Method.invokeNative(Native Method) 12-28 20:23:58.470: E/AndroidRuntime(698): at java.lang.reflect.Method.invoke(Method. java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 dalvik.system.NativeStart.main (本机方法)12-28 20:23:59.070:I/dalvikvm(698):threadid = 3:对信号3做出反应12-28 20:23:59.100:I/dalvikvm(698):将堆栈跟踪写入'/ data/anr/traces.txt' 12-28 20:24:02.420: I/Process(698): 发送信号。PID:698 SIG:9 在 java.lang.reflect.Method.invoke(Method.java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/ AndroidRuntime(698): 在 dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm(698): threadid=3: 对信号 3 作出反应 12-28 20:23:59.100: I / dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt' 12-28 20:24:02.420:I / Process(698):发送信号。PID:698 SIG:9 在 java.lang.reflect.Method.invoke(Method.java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/ AndroidRuntime(698): 在 dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm(698): threadid=3: 对信号 3 作出反应 12-28 20:23:59.100: I / dalvikvm(698):将堆栈跟踪写入'/data/anr/traces.txt' 12-28 20:24:02.420:I / Process(698):发送信号。PID:698 SIG:9 ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): at dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm (698): threadid=3: 对信号 3 做出反应 12-28 20:23:59.100: I/dalvikvm(698): 将堆栈跟踪写入 '/data/anr/traces.txt' 12-28 20:24:02.420 : I/Process(698): 发送信号。PID:698 SIG:9 ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): at dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm (698): threadid=3: 对信号 3 做出反应 12-28 20:23:59.100: I/dalvikvm(698): 将堆栈跟踪写入 '/data/anr/traces.txt' 12-28 20:24:02.420 : I/Process(698): 发送信号。PID:698 SIG:9

4

1 回答 1

1

好的,我的猜测是问题在于您在主 ui 线程中执行此操作,这远非推荐。相反,您应该做的是结帐AsyncTask,这是执行此类操作的首选方式(从文件或网络读取以及一堆其他东西)。

这比听起来容易,您需要做的是这样的事情(请注意,这只是为了让您了解它的外观):

private class CreateSocketTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        //Do the socket stuff here...
    }

    @Override
    protected void onPostExecute(String result) {
        //This is called when doInBackground has finished
        //From here you'd call a method in the main ui class.
    }
}

这是安卓文档

网上有很多教程,所以你很快就会启动并运行。

于 2012-12-28T20:41:40.340 回答