【Android】消息推送1-Socket长连接技术点总结

一、Socket 基本用法

Socket 是 TCP 层的封装。在 Java 的 SDK 中,socket 共有两个接口:用于监听客户连接的 ServerSocket 和用于通信的 Socket。使用 socket 的步骤如下:
(1)创建 ServerSocket 并监听客户连接。
(2)Socket 连接服务端。
(3)Socket 获取输入输出流进行通信。
(1)Socket客户端实现

public class SocketClient {
 
    public static void main(String[] args) {
        SocketClient client = new SocketClient();
        client.start();
    }
    
    public void start() {
        BufferedReader inputReader = null;
        BufferedReader reader = null;
        BufferedWriter writer = null;
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 9898);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            inputReader = new BufferedReader(new InputStreamReader(System.in));
            startServerReplyListener(reader);
            String inputContent;
            while (!(inputContent = inputReader.readLine()).equals("bye")) {
                writer.write(inputContent + "\n");
                writer.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
                writer.close();
                inputReader.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public void startServerReplyListener(final BufferedReader reader) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String response;
                    while ((response = reader.readLine()) != null) {
                        System.out.println(response);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
 
}
(2)Socket服务端实现

public class SocketServer {
 
    public static void main(String[] args) {
        SocketServer socketServer = new SocketServer();
        socketServer.startServer();
    }
    
    public void startServer() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(9898);
            System.out.println("server started..");
            while (true) {
                socket = serverSocket.accept();
                manageConnection(socket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public void manageConnection(final Socket socket) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                BufferedReader reader = null;
                BufferedWriter writer =null;
                try {
                    System.out.println("client " + socket.hashCode() + " connedted");
                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    String receivedMsg;
                    while ((receivedMsg = reader.readLine()) != null) {
                        System.out.println("client " + socket.hashCode() + ": " + receivedMsg);
                        writer.write("server reply: " + receivedMsg + "\n");
                        writer.flush();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        reader.close();
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
 
}
二、Socket、ServerSocket区分
(1)ServerSocket
创建ServerSocket实例时,会先调用bind将该ServerSocket绑定到一个指定的地址(IP地址+port端口),然后调用SocketImpl的listen方法监听客户端连接。最后我们调用accept,阻塞等待客户端的连接,连接成功后返回一个通信socket实例。
(2)Socket
创建Socket实例时,会调用connect去跟server建立连接。

你可能感兴趣的:(android,常用功能小点)