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;
}
}