Android Emulator无法从套接字接收数据,但相同的代码在Genymotion中工作

Android Emulator无法从套接字接收数据,但相同的代码在Genymotion中工作,android,android-emulator,genymotion,serversocket,Android,Android Emulator,Genymotion,Serversocket,我通过Java套接字客户端将数据从我的开发机器(Mac)发送到充当套接字服务器的android emulator。所以基本上我首先启动android程序,它打开套接字端口并等待数据 onStart调用两个函数,一个用于获取IP,另一个用于打开服务器套接字 @覆盖 受保护的void onStart(){ super.onStart(); getDeviceIpAddress(); 新线程(新的start_siddhi_服务器()).start(); }//开始 用于获取IP的代码是 public

我通过Java套接字客户端将数据从我的开发机器(Mac)发送到充当套接字服务器的android emulator。所以基本上我首先启动android程序,它打开套接字端口并等待数据

onStart调用两个函数,一个用于获取IP,另一个用于打开服务器套接字

@覆盖
受保护的void onStart(){
super.onStart();
getDeviceIpAddress();
新线程(新的start_siddhi_服务器()).start();
}//开始
用于获取IP的代码是

public void getDevicePaddress(){
试一试{
//通过所有网络接口设备进行循环
对于(枚举=网络接口)
.getNetworkInterfaces();枚举.hasMoreElements();){
NetworkInterface NetworkInterface=enumeration.nextElement();
//遍历网络接口设备的所有ip地址
对于(枚举enumerationIpAddr=networkInterface.getInetAddresses();枚举Ipaddr.hasMoreElements();){
InetAddress InetAddress=enumerationIpAddr.nextElement();
//过滤掉环回地址和其他不相关的ip地址
如果(!inetAddress.isLoopbackAddress()&&inetAddress.getAddress().length==4){
//将设备IP地址打印到文本视图中
Log.d(“ip地址”,inetAddress.getHostAddress());
}
}
}
}捕获(SocketException e){
Log.e(“错误:,e.toString());
}
}
用于启动服务器套接字的代码为

class start\u siddhi\u服务器实现可运行{
@凌驾
公开募捐{
Log.d(“E”,“启动siddhi服务器…”);
//创建Siddhi管理器
SiddhiManager SiddhiManager=new SiddhiManager();
字符串定义1=“定义流温度(房间无字符串,温度int);”;
字符串query1=“@info(name='query1')来自温度[temp>=10]”+
“选择房间号、温度”+
“插入myOutputStream;”;
//生成运行时
SiddhiAppRuntime SiddhiAppRuntime=siddhiManager.createSiddhiAppRuntime(定义1+query1);
//添加回调以从查询检索输出事件
addCallback(“myOutputStream”,newstreamcallback()){
@凌驾
公共无效接收(事件[]事件){
//用于迭代每个事件的for循环
对于(事件:事件){
Log.d(“复杂事件=”,“温度为”+事件.getData(1));
}//结束
}//接收结束方法
});//回调结束
//获取输入处理程序
InputHandler inputHandlerA=siddhiAppRuntime.getInputHandler(“温度”);
//启动siddhi应用程序
siddhiAppRuntime.start();
//启动服务器套接字
ServerSocket ServerSocket=null;
试一试{
serverSocket=新的serverSocket(7000);
}捕获(IOE异常){
e、 printStackTrace();
}
套接字=空;
Log.d(“E”,“Siddhi服务器正在等待传感器数据……”);
while(true){
试一试{
socket=serverSocket.accept();
}捕获(IOE异常){
e、 printStackTrace();
}
if(socket.isConnected()==true){
日志d(“E”,“连接成功……”);
InputStreamReader isReader=null;
试一试{
isReader=新的InputStreamReader(socket.getInputStream());
}捕获(IOE异常){
e、 printStackTrace();
}
BufferedReader输入=新的BufferedReader(isReader);
弦线;
试一试{
而((line=input.readLine())!=null){
字符串[]tupleData=line.split(“,”);
字符串[]传感器_值=新字符串[10];
int i=0;
for(字符串元组:tupleData){
字符串[]tupleValue=tuple.split(“=”);
传感器_值[i]=三倍值[1];
i+=1;
}//元组端点的密钥对
整数患者_id=Integer.valueOf(传感器_值[0]);
整数传感器_id=整数.valueOf(传感器_值[1]);
整数uid=整数.valueOf(传感器_值[2]);
Long egtl=Long.valueOf(传感器_值[3]);
长edtl=0L;
//长edtl=长数值OF(传感器_值[4]);
整数值=整数值(传感器_值[4]);
send(新对象[]{uid,value});
//Log.d(“patient_id=,String.valueOf(patient_id));
//Log.d(“sensor_id=,String.valueOf(sensor_id));
//Log.d(“uid=,String.valueOf(uid));
//Log.d(“egtl=,String.valueOf(egtl));
}//当
}捕获(IOE异常){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}
}//socket.isConnected()
}//while(true)
}//运行
}//正在运行服务器
此外,清单文件中的权限是


案例1。 当我使用emulator运行它时,我得到以下IP地址

10.0.2.15
ifconfig的结果也是一样的

generic_x86:/$ifconfig eth0
eth0链路封装:UNSPEC驱动程序虚拟网络
inet地址:10.0.2.15 Bcast:10.0.2.255掩码:25
adb forward tcp:7000 tcp:7000