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、测试结果截图如下