Android Socket Client 未发送并自行关闭



我对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客户端,但我没有管理它。

这是我的Mainactivity:

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;
}
    }

到目前为止一切顺利。当我在安卓智能手机上启动我的应用程序时,应用程序启动没有任何问题。然后我在我的EditText字段'textOut'中输入一些东西,并按下'Send'按钮。然后我的屏幕变黑,程序自动关闭。我还在AndroidManifest.xml中粘贴了进入互联网和使用访问Wifi的权限。

我希望有人能帮助我,因为我已经研究这个问题2天了,还没有找到任何解决方案。我主要使用这条边(http://android-er.blogspot.de/2011/01/simple-communication-using.html),当然还有其他一些边,但在那里我得到了最多的信息。此外,在我的源代码中没有显示错误。

致以亲切的问候

Lukas5060

编辑:这是我的LogCat:

12-28 20:21:55.929: I/dalvikvm(698): threadid=3:对信号3作出反应12-28 20:21:56.039: I/dalvikvm(698):写入堆栈跟踪到'/data/anr/trace .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_金鱼(698):Emulator without GPU emulation detected。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): closing down VM .日志示例12-28 20:23:58.430: W/dalvikvm(698): threadid=1:线程退出未捕获异常(group=0x409c01f8)12-28 20:23:58.470: E/AndroidRuntime(698): FATAL EXCEPTION: main . exe12-28 20:23:58.470: E/AndroidRuntime(698): android.os. networkonmainthreadexeption .日志示例12-28 20:23:58.470: E/AndroidRuntime(698): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)12-28 20:23:58.470: E/AndroidRuntime(698): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)12-28 20:23:58.470: E/AndroidRuntime(698): at libcore.io. ibridge . connecterno (ibridge .java:127)12-28 20:23:58.470: E/AndroidRuntime(698): at libcore.io. ibridge .connect(ibridge .java:112)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.Socket.startupSocket(Socket.java:566)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.Socket.tryAllAddresses(Socket.java:127)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.Socket.(Socket.java:177)12-28 20:23:58.470: E/AndroidRuntime(698): at java.net.Socket.(Socket.java:149)12-28 20:23:58.470: E/AndroidRuntime(698): at net.ibasic.AndroidClient$1.onClick(AndroidClient.java:50)12-28 20:23:58.470: E/AndroidRuntime(698): at android.view.View.performClick(View.java:3511)12-28 20:23:58.470: E/AndroidRuntime(698): at android.view.View$PerformClick.run(View.java:14105)12-28 20:23:58.470: E/AndroidRuntime(698): at android.os.Handler.handleCallback(Handler.java:605)12-28 20:23:58.470: E/AndroidRuntime(698): at android.os.Handler.dispatchMessage(Handler.java:92)12-28 20:23:58.470: E/AndroidRuntime(698): at android.os. loop .loop(loop .java:137)12-28 20:23:58.470: E/AndroidRuntime(698): at android.app.ActivityThread.main(ActivityThread.java:4424)12-28 20:23:58.470: E/AndroidRuntime(698): at java.lang.reflect.Method。invokeNative(本地方法)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): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)12-28 20:23:58.470: E/AndroidRuntime(698): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)12-28 20:23:58.470: E/AndroidRuntime(698): at dalvik.system. native . art.主要(本地方法)12-28 20:23:59.070:我/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

好吧,我的猜测是,问题是你这样做在主ui线程,这是远远不推荐的。相反,你应该做的是签出AsyncTask,这是做这种操作(从文件或web和一堆其他东西中读取)的首选方式。

这比听起来容易,你需要做的是这样做(注意,这只是给你一个感觉如何看起来):

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.
    }
}

android文档

网上有很多教程,你很快就能上手。

最新更新