映射IP使模拟器可以通信

在课程大项目中,一项任务为两个手机间通信,但是模拟器无IP提供支持,故上网搜索解决方法,现在描述一可行方案作为总结报告。

在电脑上开两个模拟器,两个模拟器的IP地址都是一样的,所以要实现通信,使用模拟器的IP地址是办不到的。但是我们可以通过端口映射来进行操作,因为模拟器实际上有一个模拟地址为10.0.2.2,地址就是相当于127.0.0.1.所以在adb命令中使用:>adb –s emulator-5554 forwardtcp:8000 tcp:9000即可把本机端口TCP/8000映射到模拟器(5554)TCP/9000端口。

服务器端关键代码为:

 server = newServerSocket(9000);

                    socket = server.accept();

        if(server!=null)

        {

            new Thread(new Runnable() {

            public void run() {

                try {

                    socket =server.accept();

                }catch(IOException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                while (true) {

                    try {

                        ReceiveMsg();

                    }catch(IOException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

            }

        }).start();

        }

 

private voidReceiveMsg() throwsIOException {

        reader = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

 

        Stringtxt = reader.readLine();

        tv.setText(txt);

 

    }

 

客户端关键代码为:

        try {

            socket = new Socket("10.0.2.2",8000);

        }catch(UnknownHostException e1) {

            // TODO Auto-generated catch block

            e1.printStackTrace();

        }catch(IOException e1) {

            // TODO Auto-generated catch block

            e1.printStackTrace();

        }

        button.setOnClickListener(new OnClickListener() {

           

        public void onClick(View v) {

                Stringtxt = et.getText().toString();

                if (txt != "" && txt!= null){

                    try {

                        SendMsg(txt);

                    }catch(IOException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }}

                   

            }

        });

       

     privatePrintWriter getWriter(Socketsocket) throws IOException {

        OutputStreamsocketOut = socket.getOutputStream();

        return new PrintWriter(socketOut, true);

    }

    private void SendMsg(String Msg) throws IOException {

        writer = new BufferedWriter(new OutputStreamWriter(

                socket.getOutputStream()));

        writer.write(Msg);

        writer.flush();

 

    }

实现效果如图所示:






实现原理分析:模拟器(5556)通过连接10.0.2.2:8000,相当于连接本机(PC)的127.0.0.1:8000,由于本机IP的8000端口进行过端口映射,映射到模拟器(5554)的9000端口。所以,来自模拟器(5556)的连接请求会发送到模拟器(5554)上。实现了两个模拟器之间的网络通信功能。

此方法在本机调试时非常有用。

 





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值