灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2477回复:0

android使用socket于本地PC进行通信的问题

楼主#
更多 发布于:2012-09-06 13:44


1.自己首先建立个java project.用它做为服务器端的程序,代码如下:
package com.server;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Myserver {
public static void main(String[] args) {
  try {
   ServerSocket server=new ServerSocket(5000);
   while(true){
    Socket client=server.accept();
    OutputStream out=client.getOutputStream();
    String msg="Hello Android";
    out.write(msg.getBytes());
    client.close();
  
   }
  } catch (IOException e) {
  
   e.printStackTrace();
  }
}
}

2.建立Android客户端程序,代码如下:
package com.Android;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.widget.TextView;
public class SocketTestActivity extends Activity {
    private TextView myTextView;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myTextView=(TextView)findViewById(R.id.msgTextView01);
        myTextView.setText("dd");
        try {
        
   Socket socket=new Socket("127.0.0.1",5000);
     myTextView.setText("ff");
   InputStream in=socket.getInputStream();
   byte[]buffer=new byte[in.available()];
   in.read(buffer);
   String msg=new String(buffer);
   System.out.println(msg);
  } catch (UnknownHostException e) {

   e.printStackTrace();
  } catch (IOException e) {
    myTextView.setText("ee");
   e.printStackTrace();
  }
    }
}
3.然后运行java project中的程序,查看端口,已经等待监听。
4.运行Android应用程序在客户端,报错,无法建立socket连接,错误信息是java.net.PlainSocketImpl.connect,这说明没有连接成功,因为IP地址或端口号错误。
花了好长时间在网上查看原因,有说把ip:127.0.0.1改成10.0.2.0的,结果不行,10.0.2.2是模拟器的IP,相当于本地的127.0.0.1.是Android的路由器给每个模拟器分配的IP地址。
有进入cmd,输入ipconfig,直接使用里面的IP的,也不行的。
后来进行端口的映射,使用命令telnet localhost 5554,
diret tcp:5000:6000,也不行,后来发现这是在两天模拟器上进行请求转发是需要配置的信息,不能完成模拟器和PC的通信的。
最后尝试将端口号写成模拟器的端口号,我5554或5556,还是不行的。
这都要害死我了。
这才是王道,这才是正解:

Android的官方网站上是这么写的:本地网络连接受限。每个模拟器运行在后台的虚拟路由上,模拟器不能接入物理路由器。于模拟器交互信息可能被本地的防火墙阻塞,或者被你连接的防火墙阻塞。也就是说两个模拟器直接可以通过请求转发实现通信,模拟器和PC不能通信。

我的解决方法:用真机进行测试,通过了。没有真机的,那就没办法了。希望那些还没解决的人不要浪费时间了。期待google能快点解决这个问题。


喜欢0 评分0
游客

返回顶部