zoukankan      html  css  js  c++  java
  • Socket 长连接 短连接 心跳 JAVA SOCKET编程

    简单解释就是:

    短连接:建立连接,发送数据包。关闭连接

    长连接:建立连接。发送数据包,发送心跳包,发送数据包,发送心跳包。发送心跳包。

    。。。。。


    所以又频繁的数据收发的话。短连接会频繁创建TCP连接,而对于长连接。则始终用的是同一个TCP连接


    package com.tree.demo.socket;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerSocketDemo {
    
    	private static final int PORT = 1234;
    	
    	private static final int BUFFER_SIZE = 1024;
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			ServerSocket ss = new ServerSocket(PORT);
    			Socket s = ss.accept();
    			System.out.println("这是服务端,监听本机"+PORT+"端口");
    			byte[] recData = null;
    			InputStream in = s.getInputStream();
    			OutputStream out = s.getOutputStream();
    			while(true) {
    				recData = new byte[BUFFER_SIZE];
    				int r = in.read(recData);
    				//int r = in.read(recData);
    				if(r>-1) {
    					String data = new String(recData);
    					if(data.trim().equals("over")) {
    						s.close();
    					}
    					System.out.println("读取到client发送的来数据:"+data);
    					out.write("这是服务端发给client的数据:".getBytes());
    					out.write(recData);
    				}else {
    					System.out.println("数据读取完成。");
    					s.close();
    					System.exit(0);
    					//ss.close();
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    以上这样的服务端读数据是堵塞式。假设client没有数据写过来。服务端就会一直堵塞在那不动

    client开启一个telnet就可以測试服务端的socket程序了,当然你也能够自己写一个socketclient,例如以下:

    package socket;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class ClientSocketDemo {
    
    	private static final String HOST = "192.168.8.14";
    
    	private static final int PORT = 1234;
    
    	public static void main(String[] args) throws UnknownHostException,
    			IOException {
    		Socket client = new Socket(HOST, PORT);
    		OutputStream out = client.getOutputStream();
    		try {
    			while (true) {
    				Thread.sleep(1000);
    				System.out.println("发送心跳数据包");
    				out.write("send heart beat data package !".getBytes());
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			out.close();
    			client.close();
    		}
    	}
    
    }
    
    同一时候这要是一个心跳的实例。心跳仅仅要不出现异常的情况下,能够直接使用client连接发送数据包,不须要new socket新建连接了。


    accept()等待连接,该方法堵塞当前线程直到建立连接为止


    以上服务端的网络程序仅仅能和一个client程序连接,拒绝多个client的连接。

    我们能够通过线程来解决问题:每当程序建立一个新的套接字连接。也就是调用accept方法时。将启动一个新的线程来处理server和client的连接。而主程序将马上返回并等待下一个连接。


    详细内容请见:http://blog.csdn.net/simonchi/article/details/40785441



  • 相关阅读:
    mac上finalShell的安装
    c 字符串与字符串操作
    .net5 MailKit
    c 99乘法表
    element 动态表单加自定义校验
    遇到的问题 vscode 问题
    vue-element-admin eslint 规则查询表
    利用html2canvas 导出网页 (只是用于自己的笔记,如果需要看配置,自行查找插件api)
    git 常用命令
    uniapp中自动打包微信小程序后自动上传代码
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7115327.html
Copyright © 2011-2022 走看看