1.首先什么是socket?
答:socket,意思是套接字,简单意思是,插座上的插孔,服务器有若干插孔,每个客户端类似一个插头,我们把插头插入插孔,就形成了一个传输通道,有了这个通道就可以传输数据了。这纯碎个人理解哦。当然初次接触这样理解就好了。
2.简单用法
首先要搭建一个服务端(ServerClient)和一个客户端(CustomClient), 服务端用来接收客户端的连接请求,当然这个请求首先由客户端发起。废话少说:先搭建一个简单服务端(我这里方法写在android studio 测试用例里面了)
//服务端代码
@Test public void ServerClient() { final int PORT = 8000;//提供客户端访问的端口号,要确保两端一致 List<Socket> mList = new ArrayList<Socket>(); ServerSocket server = null; ExecutorService mExecutorService = Executors.newCachedThreadPool();//创建一个线程池 Socket client = null; try { server = new ServerSocket(PORT);//创建一个服务端对象,用来接收客户端连接 System.out.println("服务端已启动..."); //这是一个死循环,用来不断循环监听,是否有客户端请求 while (true) { client = server.accept(); mList.add(client); //当客户端连接成功,新开一条线程去处理相关业务 mExecutorService.execute(new MyRunnable(client)); } } catch (IOException e) { e.printStackTrace(); } } public class MyRunnable implements Runnable { private Socket socket; private BufferedReader in = null; private PrintWriter printWriter=null; String receiveMsg; String sendMsg; public MyRunnable(Socket socket) { this.socket = socket; } @Override public void run() { //这里也是一个死循环,在此客户端没有断开之前,实时响应客户端请求,并且给出回复 //如果客户端发出断开请求 ,当然是约定好,假如客户端发送一个exit,那么我不在循环 while (true){ try { DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); String msg=dataInputStream.readUTF(); System.out.println("msg:"+msg); DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream()); dataOutputStream.writeUTF("收到了客户端的信息:"+msg); dataOutputStream.flush();
if(msg.contains("exit")){ socket.close(); break;//跳出循环 }
} catch (IOException e) { e.printStackTrace(); } } } }
//安卓服务客户端代码
//开启socket 长连接 private Socket mSocket; private OutputStream mOutputStream; private DataOutputStream mDataOutputStream; private void startLongLink() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... voids) { try { if (mSocket == null || mSocket.isClosed() || !mSocket.isConnected()) { mSocket = new Socket("192.168.8.111", 8000); } else { Log.e("TAG", "socket is alive"); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if (mSocket != null && !mSocket.isClosed() && mSocket.isConnected()) { sendMsgToServer(); executorService.execute(new Runnable() { @Override public void run() { while (true){ try { InputStream inputStream=mSocket.getInputStream(); if(inputStream!=null){ DataInputStream dataInputStream=new DataInputStream(inputStream); Log.e("TAG","server apply:"+dataInputStream.readUTF()); } } catch (IOException e) { e.printStackTrace(); } } } }); } } }.execute(); } private void sendMsgToServer() { executorService.execute(new Runnable() { @Override public void run() { try { mOutputStream = mSocket.getOutputStream(); mDataOutputStream = new DataOutputStream(mOutputStream); mDataOutputStream.writeUTF(editText.getText().toString()); mDataOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); } } }); }