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、服务器端代码如下:
3、客户端代码如下:
[color=red]4、重点:在Mainfest文件中添加网络访问权限[/color]
5、测试结果截图如下
[img]http://dl2.iteye.com/upload/attachment/0095/8349/73aa076e-73d6-3186-b35c-76259ae6fd82.png[/img]
[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]