之前写模拟器和pc机通信没有遇到过多大问题,这两天想做一个把Socket通信的服务端和客户端都用Android模拟器实现,有点小麻烦,搜集一些资料,也试用很多方法,最后终于实现了模拟器之间的链接:
第一步:首先是创建两个模拟器:cmd下命令创建或在eclispe中创建avd都可以实现,这里不多说
第二步:启动两个模拟器
第三步:查看模拟器设备是否正常启动
在命令行中输入adb devices (前提启动模拟器)
第四步:选择一个模拟器作为服务器,假如选择emulator-5554 device, 客户端为emulator-5556 device
在cmd中执行如下命令:telnet localhost 5554 进入如下界面:
然后继续执行:redir add tcp:8192:8191 作下重定向
注意:如果telnet localhost 5554命令不识别时,请到控制面板安装Telnet客户端
第五步:编写服务端代码
public class MySocketServerActivity extends Activity {
//坐标值
float event_x=0;
float event_y=0;
public static final int SERVERPORT = 8191; //注意这里和上面重定向的配置是有关系的。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurface(this));
new MyServerThread().start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
event_x=event.getX();
event_y=event.getY();
System.out.println("获得坐标["+event_x+","+event_y+"]");
return super.onTouchEvent(event);
}
//启动服务器线程
class MyServerThread extends Thread{
@Override
public void run() {
try {
System.out.println("AAAAAAAAAAAAAAAA1");
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
System.out.println("AAAAAAAAAAAAAAAA2");
while (true) {
Socket client = serverSocket.accept();
//写入坐标值
OutputStream os=client.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
bw.write("服务器坐标信息:["+event_x+","+event_y+"]");
bw.close();
}
}catch(Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
}
}
class MySurface extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder holder;
public MySurface(Context context) {
super(context);
holder= getHolder();
holder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas=holder.lockCanvas();
Paint paint=new Paint();
paint.setColor(Color.RED);
canvas.drawRect(10, 10, 150, 80, paint);
paint.setColor(Color.WHITE);
canvas.drawText("坐标测试区", 40, 30, paint);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
客户端代码:
public class MySocketClient extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
Socket socket = new Socket("10.0.2.2", 8192);//注意这里也是和上面重定向的配置是有关系的。而且这里的地址必须是10.0.2.2
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String msg=br.readLine();
Toast.makeText(this, "获取服务器传来的坐标:"+msg,Toast.LENGTH_LONG).show();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
启动服务端程序,启动客户端程序
注意:两个程序的AndroidManifest.xml都必须加上下面这个权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
如果想查看程序执行过程 :
在cmd中执行如下命令
执行 adb -s emulator-5554 shell
然后执行logcat,可以查看执行log信息
启动客户端: