实现两台Android模拟器之间的Socket通讯


1、前言


         其实解决的方法在Android的SDK Document里面已有说明,只是如果在网上找会找到很多方法,但是都没办法很好的实现(可能我悟性不够),具体的解决方法参考android-sdk/docs/guide/developing/devices/emulator.html中的说明。


2、缘由


        最近在做一个项目,需要使两台Android设备之间通过WIFI进行Socket通讯,因此必须要有两台设备,可是我太穷了,一个设备都没有,于是就想到能否通过两台模拟器来模拟网络通讯来解决前期的技术点测试。


3、官方说明




4、解决方法——网络配置


Step1:启动两个模拟器分别为5554和5556。

Step2:假定5554作为服务端,那么监听服务端口为5013(可以根据自己需要设定)。

Step3:假定556作为客户端,那么发送服务请求端口为5014(可以根据自己需要设定)。

Step4:打开CMD,运行"telnet localhost 5554",该命令表示使用Telnet连接至服务端。

Step5:在Telnet中执行redir add tcp:5014:5013,该命令表示在服务端把客户端端口映射到服务端端口上,此时两者就可以进行通讯。

Step6:在Telnet中执行quit,退出Telnet。


5、解决方法——Java代码


注意:一定要在Manifest中增加网络权限<uses-permission android:name="android.permission.INTERNET"/>。


服务器代码:

package org.siso.socketserverdemo;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

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

public class MainActivity extends Activity {
	private String TAG = "===Server===";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
        	Log.i(TAG, "1.创建ServerSocket");
			ServerSocket serverSocket = new ServerSocket(5013);
			while (true) {
				Log.i(TAG, "2.等待客户端连接");
				Socket socket = serverSocket.accept();
				Log.i(TAG, "3.连接成功,发送数据");
				OutputStream oStream = socket.getOutputStream();
				oStream.write("来自服务器的信息\n".getBytes("utf-8"));
				Log.i(TAG, "4.发送完毕,关闭连接");
				oStream.close();
				socket.close();
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

客户端代码:

package org.siso.socketclientdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	private String TAG = "===Client===";
	private TextView clientShow = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        clientShow = (TextView)findViewById(R.id.clientShow);
        try {
        	Log.i(TAG, "1.连接服务器");
			Socket socket = new Socket("10.0.2.2", 5014);
			Log.i(TAG, "2.接收数据");
			BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String line = bReader.readLine();
			Log.i(TAG, "3.显示数据");
			clientShow.setText(line);
			Log.i(TAG, "4.关闭连接");
			bReader.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值