消息推送之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
- 消息推送之Socket----长连接和心跳
- Netty维持长连接 消息推送及心跳机制
- Socket心跳包,Socket长连接之旅
- Socket 长连接 心跳包
- Java 心跳 Socket 长连接
- Socket通讯长连接和短连接、心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- Socket 长连接与短连接,心跳
- 安卓开发实现长连接,心跳,java后端,实现消息推送,持续更新中
- dyld: Library not loaded: @rpath
- 腾讯优测干货分| 深入揭秘HTTPS安全问题&连接建立全过程
- 一分钟教会你解析任何复杂Json字符串:Android Stuoid GsonFormat插件+Gson.jar
- Codeforces 677 B.Coat of Anticubism【水题】
- Android如何实现Md5PasswordEncoder的encodePassword加密方法(附iOS实现方式)
- 消息推送之Socket----长连接和心跳
- JavaScript中的方法重载
- Android开发笔记之关闭AlterDialog.Builder对话框
- MYSQL视图的学习笔记
- runtime的知识
- Codevs 1001 舒适的路线 2006年 NOIP全国联赛提高组
- python 查询 ip 对应注册公司
- Sencha Test 使用示例 – Part 1
- 使用链表的基本操作