情形一:
Android_Server:
final int SERVER_PORT = 12345;
    private void startServer()
    {
        try
        {
            Log.e("s: connecting...", "");
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            while (true)
            {
                Socket client = serverSocket.accept();
                Log.e("s: receiving...", "jjjjjj");
                try
                {
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String str = in.readLine();
                    Log.e("s: received:'" , "%%%%%%" + str);
                }
                catch (Exception e)
                {
                    Log.e("s: error", "");
                    e.printStackTrace();
                }
                finally
                {
                    client.close();
                    Log.e("s:done", "");
                }
                Thread.sleep(3000);
            }
        }
        catch (Exception e)
        {
            Log.e("s:error", "");
            e.printStackTrace();
        }
    }PC_Client:
try
        {
            Runtime.getRuntime().exec("adb forward tcp:12581 tcp:12345");
        }
        catch (IOException e3)
        {
            e3.printStackTrace();
        }
        
        Socket socket = null;
        try
        {
            InetAddress serverAddr = null;
            serverAddr = InetAddress.getByName("127.0.0.1");
            System.out.println("TCP 1111" + "C: Connecting...");            socket = new Socket(serverAddr, 12581);//此处的12581是PC开放的端口,已重定向到Device的12345端口
            
            String message = "AndroidRes,Where is my Pig (Android)?";
            System.out.println("TCP 2222" + "C: Sending: '" + message + "'");
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            out.println(message);
        }
        catch (UnknownHostException e1)
        {
            System.out.println("TCP 3333" + "ERROR:" + e1.toString());
        }
        catch (IOException e2)
        {
            System.out.println("TCP 4444" + "ERROR:" + e2.toString());
        }
        finally
        {
            try
            {
                if (socket != null)
                {
                    socket.close();
                }
            }
            catch (IOException e)
            {
                System.out.println("TCP 5555" + "ERROR:" + e.toString());
            }
        }
    }
Android_Server与PC_Client连接成功~情形二:
PC_Server:
try
        {
            Runtime.getRuntime().exec("adb forward tcp:12555 tcp:12345");
            
            System.out.println("s: connecting...");
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            while (true)
            {
                Socket client = serverSocket.accept();
                System.out.println("s: receiving...");
                try
                {
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String str = in.readLine();
                    System.out.println("s: received:'" + str + "'");
                }
                catch (Exception e)
                {
                    System.out.println("s: error");
                    e.printStackTrace();
                }
                finally
                {
                    client.close();
                    System.out.println("s:done");
                }
            }
        }
        catch (Exception e)
        {
            System.out.println("s:error");
            e.printStackTrace();
        }
Android_Client:
Socket socket = null;
        try
        {
            InetAddress serverAddr = null;
            serverAddr = InetAddress.getByName("127.0.0.1");
            Log.e("TCP 1111", "C: Connecting...");            socket = new Socket(serverAddr, 12345);
            
            String message = "AndroidRes,Where is my Pig (Android)?";
            Log.e("TCP 2222", "C: Sending: '" + message + "'");
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            out.println(message);
        }
        catch (UnknownHostException e1)
        {
            Log.e("TCP 3333", "ERROR:" + e1.toString());
        }
        catch (IOException e2)
        {
            Log.e("TCP 4444", "ERROR:" + e2.toString());
        }
        finally
        {
            try
            {
                if (socket != null)
                {
                    socket.close();
                }
            }
            catch (IOException e)
            {
                Log.e("TCP 5555", "ERROR:" + e.toString());
            }
        }
Android_Client与PC_Server连接失败~抛出以下异常:
E/TCP 1111(12986): C: Connecting...
E/TCP 4444(12986): ERROR:java.net.ConnectException: /127.0.0.1:12345 - Connection refused我的问题是:
1、Android与PC通信时,是否Android端只能做Server?
2、若Android可以做Client端,要怎么实现,以上代码哪儿有问题?
3、有更多相关的知识也请附上共享,谢谢~~

解决方案 »

  1.   

    1. 如果想使用socket通信,需要在mainfest.xml中添加permission: android.permission.INTERNET
    2. 如果没有root权限,无法绑定低于1024的端口。
      

  2.   


    关于回复1:permission是加上的,不然情形1就不会通过了;我的问题是,为什么情形1能成功,情形2不能呢?谢谢以上的回答~ 
      

  3.   

    我也是搜出来的:现贴下完整点的:问题是这样的,android模拟器(simulator)把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器自己!这是不行的!如果你想在模拟器上面访问你的电脑,那么就使用android内置的IP 10.0.2.2 吧,  10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名alias在模拟器上用10.0.2.2访问你的电脑本机参考网址:http://80x86.javaeye.com/blog/539356
      

  4.   

    好贴!
    有个很急的问题:用usb去配置tcp/ip连接,该怎么做呢?多谢!
      

  5.   

    插上USB线后,如果android手机端是客户端的话,怎么知道PC的IP呢?
      

  6.   


    android和PC通信有个端口重定向的过程,已经不做Android了,所以这个问题回答不清楚了,请搜索相关资料  ;)
      

  7.   

    如果用两个Android模拟器来通信的话, 端口号为5556的模拟器用来充当Server, 端口号为5554的模拟器充当Client,则它们之间的地址也是10.0.2.2吗? 我试过,怎么不行啊?接受不到, 我用UDP来传输
      

  8.   

    使用模拟器是可以互相访问的,但是用usb连接手机的时候就不能访问了!
      

  9.   

    谢谢楼主,谢谢大家。楼主的这个问题和大家的讨论在android Socket方面给了我很大的帮助
      

  10.   

    请问,你第一个服务端在模拟器上,客户端在PC上,能连吗? 
    Runtime.getRuntime().exec("adb forward tcp:12581 tcp:12345");
    这条语句就通不过吧?
      

  11.   

    ???我想知道android用于服务器时需要用到Runtime.getRuntime().exec("adb forward tcp:12555 tcp:12345");这句话吗?这句话有什么作用啊,希望楼主帮我解答下,谢谢了
      

  12.   

    Android肯定也可以做sever的, 要不大家就去骂死google吧
      

  13.   

    SOCKET 正好需要这方面的东西 一下楼主
      

  14.   

    好像各位都是通过内网地址访问的,我想问一下,如果手机和pc不用数据线连接,通过外网ip能够进行绑定吗?
      

  15.   

    真机通过USB连接PC,10.0.2.2访问PC,连不上,是手机上要设置什么吗?而在PC机上的模拟器上却能访问。求解!!
      

  16.   

    我也是在真机上不能连接,有没有人在真机上用usb通信成功的?求教!!!
      

  17.   

    各位朋友,本人已不从事Android,但仍欢迎大家就此问题进行讨论~~
    另外,关于这个问题,我想给大家提供一个思路---找到ddmlib.jar并反编译之,找到ADB相关类,然后阅读其如何实现的,这是最直接最深刻的方式了,希望对各位有用!
      

  18.   

    android一般不做server,移动平台没有固定的IP
      

  19.   

    最近我也在找这个问题的解决方法,用netstat看,模拟器有一个从10.0.2.15到10.0.2.2的链接,但真机没有,所以估计有什么服务运行在模拟器上。我的真机是HTC G7。
      

  20.   

    或许这个对你有帮助,PC电脑和Android模拟器访问及模拟器之间tcp/udp通信