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

1、创建一个模拟器([color=red]API level小于等于10[/color],当时选择了很多模拟器,只有模拟器的android版本较低时,可以测试通,具体原因也不知道为什么),建立模拟器的截图如下:
[img]http://dl2.iteye.com/upload/attachment/0095/7179/2efb9e83-a798-34f0-afaa-edb19dfc0f65.png[/img]
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;
}

}

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

5、测试结果截图如下
[img]http://dl2.iteye.com/upload/attachment/0095/8349/73aa076e-73d6-3186-b35c-76259ae6fd82.png[/img]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值