android模拟器和PC相互通信(IP+端口+ socket)
实现方法:android socket
① 服务程序运行在PC端
② 客户端程序运行在android模拟器
实现形式:由android 模拟器向服务程序发出消息,然后服务程序会送消息至模拟器。
注意要点:
一、服务程序在PC端,需要指定电脑的端口,以提供数据访问的渠道。
二、客户端程序需要同样的端口 以及 PC的ip地址进行socket联络
三、数据通信用进程方式实现,可以支持多个客户端访问
四、代码层面:
1、 AndroidManifest.xml需要添加
<uses-permissionandroid:name="android.permission.INTERNET" />
以提供网络访问权限支持
2、 部分模拟器版本和android-SDK版本不匹配,此时去掉AndroidManifest.xml中的
<uses-sdk android:minSdkVersion="15" />就不会报错。
3、 PC的IP为实际上外网的IP,即,IPV4。通过命令行cmd,ipconfig查询即可。
代码:
服务端:Java项目,运行于PC:
Package: com.android.server
name:ServerThread
客户端:android项目,运行于android模拟器
package :com.android.client
name:MyClientActivity
代码:
服务程序代码:
package com.android.server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class PCServer {
publicstatic void main(String a[]) {
newServerThread(5554).start();
}
}
class ServerThread extends Thread {
privateint Port;
privateServerSocket serversocket = null;
privateSocket client;
ServerThread(intport) {
Port= port;
}
publicvoid run() {
try{
serversocket= new ServerSocket(Port);
while(true) {
client= serversocket.accept();
System.out.println("serveraccept");
try{
//接收客户端消息
BufferedReaderin = new BufferedReader(
newInputStreamReader(client.getInputStream()));
Stringstr = in.readLine();
System.out.println("read:"+ str);
//向服务器发送消息
PrintWriterout = new PrintWriter(new BufferedWriter(
newOutputStreamWriter(client.getOutputStream())),
true);
out.println("MSGfrom server:Your message(" + str + ")has been successfullysent!");
//关闭输入输出流
out.close();
in.close();
}catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}finally {
//关闭客户端
client.close();
System.out.println("serverclose");
}
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
客户端程序代码:
package com.android.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MyClientActivity extendsActivity {
privatefinal String DEBUG_TAG = "Activity01";
privatestatic String IpAddress = "10.141.31.85";
privatestatic int Port = 5554;
privateTextView mTextView = null;
privateEditText mEditText = null;
privateButton mButton = null;
/**Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton= (Button) findViewById(R.id.Button01);
mTextView= (TextView) findViewById(R.id.TextView01);
mEditText= (EditText) findViewById(R.id.EditText01);
//登陆
mButton.setOnClickListener(newOnClickListener() {
publicvoid onClick(View v) {
sendMsg();
}
});
}
publicvoid sendMsg() {
Socketsocket = null;
Stringmessage = mEditText.getText().toString() + "\r\n";
try{
socket= new Socket(IpAddress, Port); //创建Socket
PrintWriterout = new PrintWriter(new BufferedWriter(
newOutputStreamWriter(socket.getOutputStream())), true);
BufferedReaderin = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out.println(message); // 向服务器发送消息
Stringmsg = in.readLine(); //接收来自服务器的消息
if(msg != null)
mTextView.setText(msg);
else
mTextView.setText("数据错误!");
//关闭流
out.close();
in.close();
//关闭Socket
socket.close();
}catch (Exception e) {
//TODO: handle exception
Log.e(DEBUG_TAG,e.toString());
}
}
}