在课程大项目中,一项任务为两个手机间通信,但是模拟器无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();
{
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)上。实现了两个模拟器之间的网络通信功能。
此方法在本机调试时非常有用。