`
wang_2011_ying
  • 浏览: 143882 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

解决Android模拟器(客户端)与PC(服务器端)之间的socket通信

阅读更多
1、创建一个模拟器(API level小于等于10,当时选择了很多模拟器,只有模拟器的android版本较低时,可以测试通,具体原因也不知道为什么),建立模拟器的截图如下:

2、服务器端代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 服务器端
 * @author 王颖
 */
public class MultiThreadServer {
	private static int port = 5000;//端口号
	private ServerSocket serverSocket;
	private ExecutorService executorService; //线程池
	private final int POOL_SIZE = 10; //单个CPU线程池大小
	
	
	public MultiThreadServer(){
		try {
			serverSocket = new ServerSocket(port);
			//Runtime的availableProcessor()返回当前系统的CPU个数
			executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
			System.out.println("服务器启动....");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void service(){
		while(true){
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				executorService.execute(new Handler(socket));//在未来的某个时间执行给定命令
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
	
	public static void main(String[] args) {
		MultiThreadServer multi = new MultiThreadServer();
		multi.service();
		
	}
	
}

class Handler implements Runnable{
	
	private Socket socket;
	public Handler(Socket socket){
		this.socket = socket;
	}
	
	public BufferedReader getReader(Socket socket){
		InputStream socketIn = null;
		try {
			socketIn = socket.getInputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new BufferedReader(new InputStreamReader(socketIn));
	}	
	
	public BufferedWriter getWriter(Socket socket){
		OutputStream socketOut = null;
		try {
			socketOut = socket.getOutputStream();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new BufferedWriter(new OutputStreamWriter(socketOut));
	}
	
	public void run(){
		BufferedReader br = getReader(socket);
		BufferedWriter bw = getWriter(socket);
		String msg = "";
		boolean flag = false;//读
		try {
			System.out.println("等待客户端发来的信息.....");
			
			while((msg = br.readLine()) != null){
				System.out.println(msg);
				flag = true;
			}
			if(!flag){
				bw.write("服务器发来的信息");
			}
			

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				if(br != null){
					br.close();
				}
				if(bw != null){
					bw.close();
				}
				if(socket != null){
					socket.close();
				}				
			}catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
		
	}
}

3、客户端代码如下:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
 * 客户端
 * @author 王颖
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//响应确认按钮事件
		
		Button sure = (Button)findViewById(R.id.sure);
		sure.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				EditText port_Text = (EditText)findViewById(R.id.port_info);

				String port = port_Text.getText().toString();
				Toast.makeText(MainActivity.this, port, Toast.LENGTH_SHORT).show();
				
				if(sendMsg("10.0.2.2",port,"info from AVD")){
//					if(sendMsg("10.20.61.61",port,"info from AVD")){//也可
					Toast.makeText(MainActivity.this, "发送成功!", Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(MainActivity.this, "发送失败", Toast.LENGTH_SHORT).show();
				}
			}
		});

	}
	
	
    /*
	 *向服务器发送信息
	 */
	public boolean sendMsg(String ip, String port , String msg){
		try
    	{
	    	int port1 = Integer.parseInt(port);
			Toast.makeText(MainActivity.this, "socket通信的端口号:" + port1, Toast.LENGTH_SHORT).show();
			Socket socket= new Socket(ip,port1);
	     	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//	     	System.out.println("");
	     	bw.write(msg);
	     	bw.newLine();//防止阻塞
	     	bw.flush();
	     	bw.close();
	    	socket.close();
	    	return true;
    	}
    	catch(UnknownHostException e)
    	{
    		Log.e("UnknownHostException", "来自客户端信息");
    		e.printStackTrace();
    		return false;
    	} catch (IOException e) 
    	{
    		Log.e("IOException", "来自客户端信息");
    	    e.printStackTrace();
    	    return false;
        }
	}
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

4、重点:在Mainfest文件中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>

5、测试结果截图如下

  • 大小: 23.6 KB
  • 大小: 152.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics