Android应用程序启动套接字不起作用

时间:2013-02-24 08:42:40

标签: java android sockets networking emulation

这是一个简单的客户端 - 服务器Android应用程序。服务器是在本地PC上运行的简单java服务器,客户端在模拟器上运行。这是客户的代码:

package com.example.streamer;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

 class Connecting implements Runnable
{
    private Socket sock;

    private BufferedReader r;

    private BufferedWriter out;
    public Connecting ()
    {
        Thread th = new Thread(this);
        th.start();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try
        {
            System.out.println("************************ trying to initiated *****************");
        sock = new Socket("10.0.2.2",12344);

        System.out.println("************************ socket initiated *****************");

        r = new BufferedReader(new InputStreamReader(sock.getInputStream()));

        System.out.println("************************ buffer reader initiated *****************");

        out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));

        System.out.println("************************ buffer writer initiated *****************");

        }

        catch (IOException ioe) { }


    }

}

public class MainActivity extends Activity {

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

    @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_main, menu);
        return true;
    }





    @Override

    public void onResume() {

        super.onResume();

        System.out.println("************************ on resume *****************");
        Connecting c = new Connecting();

    }



}

任何人都知道为什么指令sock = new Socket("10.0.2.2", 12344);没有执行?

3 个答案:

答案 0 :(得分:1)

该命令尝试将套接字连接到外部主机。这可能需要很长时间。在许多版本的Android上它甚至会崩溃,因为你不应该在主线程上进行网络调用。将其移动到AsyncTask或线程中。

答案 1 :(得分:1)

问题可能与您未正确设置应用程序权限有关。

您应该编辑AndroidManifest.xml文件,其中包含您的应用程序要求的权限等。

像这样编辑文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.myapp" >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

<uses-permission android:name="android.permission.INTERNET" />会使应用程序要求获得连接到Internet的权限。

答案 2 :(得分:0)

在清单文件中添加这两个条件

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

它现在可以正常工作......任何其他帮助PLZ评论