消息推送之Socket----长连接和心跳

来源:互联网 发布:淘宝店名测试打分 编辑:程序博客网 时间:2024/06/05 23:06

最近学习郭霖讲的消息推送其中讲到使用原生的Socket保持长链接来实现消息的推送,这是我的短板,所以跟着仔细学习了一遍,郭神还是依旧的那么仔细那么认真,赞赞,不要骄傲要保持,而对于我就是不要急躁,要踏实做好每一点小事,加油!
废话不多说,这里附上服务器和客户端的代码,就不做解说了,这是慕课网视频教程地址:http://www.imooc.com/learn/223

客户端代码如下:

public class SocketClient {    public static void main(String[]args){        SocketClient client=new SocketClient();        client.start();    }    //这个方法实现了客户端向服务器发送消息并且收到服务器的返回的消息,没有实现客户端被动在任何时候接受服务器的消息    public void start(){        BufferedReader inputReader=null;//收消息        BufferedWriter writer=null;        BufferedReader reader=null;//用于从服务器读取数据        Socket socket=null;        try {            socket=new Socket("127.0.0.1",9696);//本机ip 127.0.0.1            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")){//读取控制台输入的每行内容,程序运之后会阻塞在这行,因为readLine为空                //System.out.println(inputContent);                //将控制台输入的东西写出到服务器                writer.write(inputContent+"\n");//reader.readLine()方法读到换行符才算一行                writer.flush();            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                inputReader.close();                writer.close();                socket.close();            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    /**     * 监听服务器随时有可能发送过来的消息     */    public void startServerReplyListener(final BufferedReader reader){        new Thread(new Runnable() {            @Override            public void run() {                String response;                try {                    while((response=reader.readLine())!=null){                        System.out.println("服务器的回复是--"+response);                    }                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }).start();    }}

服务器代码如下:

public class SocketSever {    BufferedReader reader;    BufferedWriter writer;    /**     * 为什么不在main方法中直接写逻辑而要在main方法中new一个SocketSever调用他的方法?     *  因为main方法是静态方法,在静态方法里面调用其他方法其他变量都必须声明成static才行     *      * @param args     */    public static void main(String[] args) {        SocketSever socketServer=new SocketSever();        socketServer.startServer();    }    public void startServer(){        ServerSocket serverSocket=null;        Socket socket=null;        try {            serverSocket=new ServerSocket(9696);            System.out.println("服务器启动了....");            while(true){               socket=serverSocket.accept();//程序为阻塞在这里,直到有客户端连入,并返回一个Scoket对象               manageConnection(socket);            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                socket.close();                serverSocket.close();            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    /**     * 测试心跳,每隔3秒钟向客户端发一条消息     */    public void test(BufferedWriter writer){        new Timer().schedule(new TimerTask(){            @Override            public void run() {                try {                    System.out.println("test执行了一次");                    writer.write("心跳了一次..\n");//\n不要忘记                    writer.flush();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }, 3000,3000);//任务,延迟,间隔    }    /**     * 管理服务器和客户端的连接,实现了服务器可以和多个客户端连接建立通信     * @param socket     */    public void manageConnection(final Socket socket){        new Thread(new Runnable(){            @Override            public void run() {                try {                    System.out.println("有客户端连入"+socket.hashCode());                    reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//从socket里面读入                    writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));                    String receivedMsg;                    while((receivedMsg=reader.readLine())!=null){//后又阻塞在这等待客户端发消息                        System.out.println("收到代号为"+socket.hashCode()+"的客户端发来的消息是::"+receivedMsg);                        writer.write("我收到的消息是::"+receivedMsg+"\n");                        writer.flush();                    }                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }finally{                    try {                        writer.close();                        reader.close();                    } catch (Exception e) {                        // TODO Au`o-generated catch block                        e.printStackTrace();                    }                }            }}).start();    }}
0 0
原创粉丝点击