精华内容
下载资源
问答
  • mailto协议的使用技巧

    千次阅读 2019-02-24 00:37:17
    首先mailto:是一个本地协议, 也就是说它不需要网络传输, 在本地就可以解析协议之后的内容, 其他的本地协议比如data:协议用于直接解析一个mime媒体类型, 这些协议适用于内容简短的情况下, 因为所有内容藏在url后面的...

    mailto:是一个用于发送邮件的URL协议, 简单实用, 但是许多人不知道它, 我来介绍一下.

    首先mailto:是一个本地协议, 也就是说它不需要网络传输, 在本地就可以解析协议之后的内容, 其他的本地协议比如data:协议用于直接解析一个mime媒体类型, 这些协议适用于内容简短的情况下, 因为所有内容藏在url后面的参数中.

    既然是url协议, mailto直接可以在浏览器中打开, 通常浏览器会调用系统的邮件客户端, 在编辑器上提前输入好收件人, 主题, 内容等信息, 不用用户手动拷贝进去了.

    比如mac下面打开这个<a>标签点击后就会出现这个画面:

    <a href="mailto:someone@example.com?subject=This%20is%20the%20subject&cc=someone_else@example.com&body=This%20is%20the%20body">Send email</a>
    

     

    可以看到, 主流的操作系统都是支持mailto协议的, 可以放心使用.

    其中域名就是收件人的邮箱地址(插一句, 邮箱地址是世界统一的标准, 独一无二的个人域名, 非常适合作为user-id使用), 如果有多个收件人, 域名之间用分号分隔:

    mailto:aaa@sina.com.cn;bbb@sina.com.cn

    主要的URL参数:

    • cc: 抄送地址
    • bcc: 密件抄送地址
    • subject: 主题
    • body: 初始内容

    主要这4个参数, 使用url标准的&来分隔, 可以缺省但不能自定义, 因为协议的定义是"通讯双方共同遵守的标准", 但因为没有网络的原因, 这里的"双方"是你(开发者)和操作系统, 世界统一的邮件标准就是这么简单.

    mailto当初也是web规范, 所以MDN上面也有介绍.

    还要注意的是, 因为url的缘故, 一些特殊字符得用百分号转义法,比如回车符是%0A不是\n:

    mailto作为通用标准, 应当多多使用.

    展开全文
  • 计算机网络中通信协议都有哪些

    千次阅读 2019-10-07 07:03:06
    网络通信协议1、HTTP英文名称:hyper text transport protocol中文名称:超文本传输协议网络通信协议2、FTP英文名称:file transfer protocol中文名称:...telnet中文名称:远程登录协议网络通信协议5、MAILTO英文名称...
    网络通信协议1、HTTP
    英文名称:hyper text transport protocol
    中文名称:超文本传输协议
    网络通信协议2、FTP
    英文名称:file transfer protocol
    中文名称:文件传输协议
    网络通信协议3、FILE
    英文名称:file
    中文名称:本地文件传输协议
    网络通信协议4、TELNET
    英文名称:telnet
    中文名称:远程登录协议
    网络通信协议5、MAILTO
    英文名称:mail to
    中文名称:电子邮件协议
    网络通信协议6、NEWS
    英文名称:news group
    中文名称:网络新闻组协议
    网络通信协议7、WAIS
    英文名称:wide area information servers
    中文名称:广域信息服务器协议

    转载于:https://www.cnblogs.com/Ph-one/p/6249597.html

    展开全文
  •  JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类:  1.java.net.URL:URL资源  2.java.net.URLConnection:各种URL资源...

     

           JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类:

          1.java.net.URL:URL资源

          2.java.net.URLConnection:各种URL资源连接器

        例如,当我们利用HTTP协议获取Web资源时,通常的过程如下:

     

    URL url = new URL("http://www.163.com");
    URLConnection conneciotn = url.openConnection();

     

     

            URL和URLConnection是如何做到对协议支持的呢?在它们的内部,主要涉及到了如下几个类:

            1.URLStreamHandler:协议的流处理器,负责对特定URL协议的解析,并创建符合当前协议的URLConnection;

            2.URLStreamHandlerFactory:协议处理工厂,负责为特定协议找到正确的URLStreamHandler。

            当利用URL对象创建资源时,其构造函数在去掉协议字段后将其传给URLStreamHandlerFactory,由该工厂来接受协议,为该协议找到并创建适当的URLStreamHandler实现类,最后存储在URL对象的一个字段中(即URL类中transient修饰的URLStreamHandler成员属性)。
           URLStreamHandler和URLConnection总是成对出现的。因此,若要实现对新协议的支持时,需同时实现这两个抽象类,分别负责对协议的解析,以及与服务器的交互(数据转换等)。

          另外,JAVA是如何识别当前URL协议该由哪个URLStreamHandler和URLConnection来处理的呢?在创建URL对象时,其内部调用了一个getURLStreamHandler(String protocol)静态方法,它将根据协议的名称来找到对应的URLStreamHandler实现类,其查找规则如下:

         1)检测是否创建了URLStreamHandlerFactory对象:如果创建,则直接使用createURLStreamHandler(String protocol)方法创建的协议处理器,否则进入步骤2);

         2)在java.protocol.handler.pkgs系统属性指定的包中查找与协议同名的子包和名为Handler的类,即负责处理当前协议的URLStreamHandler实现类必须在<包名>.<协议名定义的包>中,并且类名称必须为Handler。例如:com.company.net.protocol.rdp包中的Handler类将用于处理RDP协议。若仍未找到则进入步骤3);

        3)在JDK rt.jar中的sun.net.www.protocol.<name>包中查找Handler类。例如,若当前协议为ftp,则URL所使用协议处理器就应该为sun.net.www.protocol.ftp包中的Handler类。如下图:
             下面结合一个实例来说明如何开发一个新的网络协议。

              背景:senv(Server Environment Protocol)协议可让客户端连接远程服务器后发送出请求,请求的内容就是URL查询参数部分,该协议的默认端口为9527。例如:senv://192.168.1.101:9527?pro=os.name,java.version表示获取192.168.1.101这台主机的操作系统名和JRE的版本信息,如果没有查询参数,客户端将默认发送一个"?",表示获取所有的系统属性信息。

          
     1.Senv协议处理器

    package com.daniele.appdemo.net.protocol.custom.senv;
    
    import java.io.IOException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLStreamHandler;
    
    /**
     * <p>
     * 		自定义的senv协议处理器。
     *      由于senv协议的格式符合标准的URL格式:
     *      	protocol://username@hostname:port/path/filename?query#fragment
     *      因此,这个实现类只需实现父类中的openConnection()方法即可。否则,需重写父类方法
     *      protected void parseURL(URL u, String spec, int start, int limit),
     *      来重新正确的设置URL的各个属性值,例如:host,port,query等。
     * </p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-8
     * @see     
     * @since   AppDemo1.0.0
     */
    public class Handler extends URLStreamHandler {
    
    	/**
    	 * <p>当URL根据协议找到该处理器并调用openConnection()方法后,返回负责处理该协议连接的连接器</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @param u
    	 * @return
    	 * @throws IOException 
    	 * @since AppDemo1.0.0
    	 */
    	@Override
    	protected URLConnection openConnection(URL u) throws IOException {
    		return new SenvURLConnection(u);
    	}
    	
    }

     2.Senv协议连接器

    package com.daniele.appdemo.net.protocol.custom.senv;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.URL;
    import java.net.URLConnection;
    
    import com.daniele.appdemo.util.StringUtils;
    
    /**
     * <p>自定义senv协议连接器</p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-8
     * @see     
     * @since   AppDemo1.0.0
     */
    public class SenvURLConnection extends URLConnection {
    	
    	/** senv协议的默认端口号 */
    	public static final int DEFAULT_PORT = 9527;
    	
    	private Socket connection = null;
    
    	public SenvURLConnection(URL url) {
    		super(url);
    	}
    	
    	/**
    	 * <p>由于父类URLConnection中的getInputStream()方法不提供输入流的获取实现逻辑,因此这里需要重写此方法</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @return
    	 * @throws IOException 
    	 * @since AppDemo1.0.0 
    	 */
    	@Override
    	public synchronized InputStream getInputStream() throws IOException {
    		if (!connected)
    			this.connect();
    		return connection.getInputStream();
    	}
    	
    	/**
    	 * <p>senv协议连接操作</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @throws IOException 
    	 * @since AppDemo1.0.0 
    	 */
    	@Override
    	public synchronized void connect() throws IOException {
    		if (!connected) {
    			int port = url.getPort();
    			if (port < 1 || port > 65535)
    				port = DEFAULT_PORT;
    			this.connection = new Socket(url.getHost(), port);
    			connected = true;
    			// 连接后立即发送请求
    			sendRequest(url);
    		}
    	}
    	
    	/**
    	 * <p>发送senv协议请求</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @param u
    	 * @throws IOException 
    	 * @since AppDemo1.0.0
    	 */
    	protected void sendRequest(URL u) throws IOException {
    		OutputStream outputStream = this.connection.getOutputStream();
    		
    		String queryString = u.getQuery();
    		
    		/*
    		 *  将URL的查询参数部分发送给服务器,由服务器负责解析查询后返回结果。
    		 *  当参数参数部分为空时,则发送一个"?",表示查询服务器系统环境的所有信息。
    		 */
    		outputStream.write(StringUtils.isNotNullOrBlank(queryString)? queryString.getBytes() : "?".getBytes());
    		outputStream.flush();
    	}
    
    }

     

    3.协议处理器工厂

    package com.daniele.appdemo.net.protocol.factory;
    
    import java.net.URLStreamHandler;
    import java.net.URLStreamHandlerFactory;
    
    /**
     * <p>
     *       自定义协议的处理器工厂,负责针对每种自定义的协议而返回它们各自对应的协议处理器
     *       如果要用上述的查找规则1来安装协议处理器时,则需要用到这个类
     *</p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-9
     * @see     
     * @since   AppDemo1.0.0
     */
    public class CustomProtocolFactory implements URLStreamHandlerFactory {
    
    	public URLStreamHandler createURLStreamHandler(String protocol) {
    		if ("senv".equalsIgnoreCase(protocol))
    			return new com.daniele.appdemo.net.protocol.custom.senv.Handler();
    		return null;
    	}
    
    }
    

     

    4.处理Senv协议的服务器

    package com.daniele.appdemo.net.protocol.test;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    import java.nio.charset.CharsetDecoder;
    import java.util.Iterator;
    
    import org.apache.log4j.Logger;
    
    import com.daniele.appdemo.util.StringUtils;
    import com.daniele.appdemo.util.SystemUtils;
    
    /**
     * <p>处理Senv协议的服务器
     *    1.接收客户端请求
     *	  2.发送响应结果
     *  </p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-10
     * @see     
     * @since   AppDemo1.0.0
     */
    
    public class SenvProtocolServer {
    	
    	private static final Logger logger = Logger.getLogger(SenvProtocolServer.class);
    	
    	/** Senv协议的请求参数标识 */
    	public static final String REQUEST_PARAM_MARK = "pro=";
    	
    	/** Senv协议服务的默认端口号 */
    	private static final int DEFAULT_PORT = 9527;
    
    	/** 服务器的IP或主机名 */
    	private String host;
    	
    	/** 绑定了Senv协议服务的端口号 */
    	private int port = 9527;
    	
    	/** 当前就绪的服务端通道 */
    	private ServerSocketChannel serverChannel;
    	
    	/** 当前就绪的客户端通道 */
    	private SocketChannel clientChannel;
    	
    	/** 服务端的事件注册器 */
    	private Selector selector;
    	
    	/**
    	 * <p>启动Senv协议服务器</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @throws IOException 
    	 * @since AppDemo1.0.0
    	 */
    	public void start() throws IOException {
    		
    		serverChannel = ServerSocketChannel.open();
    		
    		if (port < 1 || port > 65535)
    			port = DEFAULT_PORT;
    		
    		if (StringUtils.isNotNullOrBlank(host)) {
    			serverChannel.socket().bind(new InetSocketAddress(InetAddress.getByName(host), port));
    			logger.info("Start server " + host + ":" + port);
    		} else {
    			serverChannel.socket().bind(new InetSocketAddress(port));
    			logger.info("Start server on port " + port);
    		}
    		serverChannel.configureBlocking(false);
    		selector = Selector.open();
            serverChannel.register(selector, SelectionKey.OP_ACCEPT); 
            handle();
    	}
    	
    	/**
    	 * <p>处理Senv协议请求</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @throws IOException 
    	 * @since AppDemo1.0.0
    	 */
    	protected void handle() throws IOException {
    		while (true) {
    			selector.select();
    			Iterator<SelectionKey> keySetIterator = selector.selectedKeys().iterator();
    			SelectionKey cuurentKey = null;
    			while (keySetIterator.hasNext()) {
    				// 获取当前就绪通道的键对象
    				cuurentKey = keySetIterator.next();
    				// 避免同一个就绪通道被重复处理
    				keySetIterator.remove();
    				try {
    					if (cuurentKey.isAcceptable()) {
    						serverChannel = (ServerSocketChannel) cuurentKey.channel();
    						clientChannel = serverChannel.accept();
    						if (clientChannel != null) {
    							logger.info("Receive request from " 
    									+ clientChannel.socket().getInetAddress().getHostAddress() + ":"
    									+ clientChannel.socket().getLocalPort());
    							clientChannel.configureBlocking(false);
    							clientChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
    						} 
    					} else {
    						clientChannel = (SocketChannel) cuurentKey.channel();
    						if (cuurentKey.isReadable()) 
    							writeResponse();
    					}
    				} catch (IOException e) {
    					if (clientChannel != null && clientChannel.isOpen())
    						try {
    							/*
    							 *  为防止服务端在读写客户端信息时,客户端由于某种原因被意外关闭引起服务端也被强制关闭的情况发生。
    							 *  需在catch块中也需要对客户端的通道做关闭处理, 从而防止服务端也被强制关闭的严重问题。
    							 *  另外,对就绪通道的读写过程需单独的在一个try...catch块中。
    							 */
    							clientChannel.close();
    						} catch (IOException ioe) {
    							ioe.printStackTrace();
    						}
    				} 
    			}
    		}
    	}
    	
    	/**
    	 * <p>读取客户端请求</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @return 
    	 * @throws IOException 
    	 * @throws  
    	 * @since AppDemo1.0.0
    	 */
    	protected String readRequest() throws IOException {
    		StringBuffer request = new StringBuffer();
    		CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
    		ByteBuffer buffer = ByteBuffer.allocate(1024);
    		while (clientChannel.read(buffer) > 0) {
    			buffer.flip();
    			request.append(decoder.decode(buffer).toString());
    			buffer.clear();
    		}
    		return request.toString();
    	}
    	
    	/**
    	 * <p>向客户端返回响应结果</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @throws IOException 
    	 * @since AppDemo1.0.0
    	 */
    	protected void writeResponse() throws IOException {
    		String request = readRequest();
    		int start = -1;
    		// 如果发送的请求为"?"或请求中无指定的参数时,则查询所有的系统环境属性
    		if ("?".equals(request) || 
    				(start = request.toLowerCase().indexOf(REQUEST_PARAM_MARK)) < 0) {
    			clientChannel.write(ByteBuffer.wrap(SystemUtils.formatSystemProperties().getBytes()));
    		} else {
    			// 获取请求参数值
    			String queryValueString = request.substring(start + REQUEST_PARAM_MARK.length());
    			if (StringUtils.isNullOrBlank(queryValueString))
    				clientChannel.write(ByteBuffer.wrap(SystemUtils.formatSystemProperties().getBytes()));
    			else {
    				int index = queryValueString.indexOf("&");
    				if (index > -1)
    					/*
    					 *  如果请求参数值里出现了"&"字符,
    					 *  则说明这个字符后面的内容则认为是其它一些请求参数的内容,
    					 *  因此不对这部分内容作处理
    					 */
    					queryValueString = queryValueString.substring(0, index);
    				clientChannel.write(ByteBuffer.wrap(SystemUtils.formatSystemProperties(queryValueString.split(",")).getBytes()));
    			}
    		}
    		/*
    		 *  响应内容被发送出去之后添加换行标识,
    		 *  目的是让客户端的BufferedReader对象调用readLine()方法后能将当前行的内容读取出来
    		 */
    		clientChannel.write(ByteBuffer.wrap("\n".getBytes()));
    		
    		/*
    		 *  发送完响应信息后马上关闭与客户端之间的通道。
    		 *  目的在于让客户端读取完这些响应之后,就立即释放掉资源,从而让读操作不会一直处于阻塞状态
    		 */
    		clientChannel.close();
    	}
    	public String getHost() {
    		return host;
    	}
    
    	public void setHost(String host) {
    		this.host = host;
    	}
    
    	public int getPort() {
    		return port;
    	}
    
    	public void setPort(int port) {
    		this.port = port;
    	}
    
    	public static void main(String[] args) {
    		SenvProtocolServer server = new SenvProtocolServer();
    		server.setHost("192.168.1.101");
    		try {
    			server.start();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    }

     

     4.Senv协议请求客户端

    /**
     * <p>
     * 	  Senv协议请求的客户端,主要功能分为:
     *    1.在创建第一次创建URL对象之前,添加对自定义协议的支持
     *    2.发送请求
     *    3.展示响应数据
     * </p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-9
     * @see     
     * @since   AppDemo1.0.0
     */
    
    public class SenvProtocolClient {
    	
    	public static void main(String[] args) {
    		BufferedReader reader = null;
    		try {
    			// 配置协议处理器查找规则一
    			if (StringUtils.isNullOrBlank(System.getProperty("java.protocol.handler.pkgs"))) {
    				// 设置各个协议包所在的父包路径
    				System.setProperty("java.protocol.handler.pkgs", "com.daniele.appdemo.net.protocol.custom");
    			}
    			/*
                             * 配置协议处理器查找规则二
                             * 这种方式在整个应用范围之内只能被执行一次。
                             * 如果多于一次则会出现"java.lang.Error: factory already defined"这样的错误。但不会受规则一的限制.
                             */ 
    //			URL.setURLStreamHandlerFactory(new CustomProtocolFactory());
    			
    			URL url = new URL("senv://192.168.1.101:9527/");
    			reader = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
    			String result = "";
    			while ((result = reader.readLine()) != null)
    				System.out.println(result);
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (reader != null)
    					reader.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }

     

    package com.daniele.appdemo.util;
    
    import java.util.Enumeration;
    import java.util.Properties;
    
    /**
     * <p>运行环境工具类</p> 
     * @author  <a href="mailto:code727@gmail.com">Daniele</a>
     * @version 1.0.0, 2013-5-9
     * @see     
     * @since   AppDemo1.0.0
     */
    
    public class SystemUtils {
    	
    	private static Properties properties = null;
    	
    	static {
    		properties = System.getProperties();
    	}
    	
    	/**
    	 * <p>返回格式化后的所有系统属性信息</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @return 
    	 * @since AppDemo1.0.0
    	 */
    	@SuppressWarnings("unchecked")
    	public static String formatSystemProperties() {
    		StringBuffer formatResult = new StringBuffer();
    		Enumeration<String> names = (Enumeration<String>) properties.propertyNames();
    		while (names.hasMoreElements()) {
    			String name = names.nextElement();
    			formatResult.append(name).append("=")
    				.append(properties.getProperty(name)).append("\n");
    		}
    		int length = 0;
    		return (length = formatResult.length()) > 0 ? 
    				formatResult.substring(0, length - 1) : "";
    	}
    	
    	/**
    	 * <p>返回格式化后的所有指定的系统属性信息</p> 
    	 * @author <a href="mailto:code727@gmail.com">Daniele</a> 
    	 * @param propertyKeys
    	 * @return 
    	 * @since AppDemo1.0.0
    	 */
    	public static String formatSystemProperties(String[] propertyKeys) {
    		StringBuffer formatResult = new StringBuffer();
    		if (propertyKeys != null && propertyKeys.length > 0) {
    			for (String key : propertyKeys) 
    				formatResult.append(key).append("=")
    					.append(properties.getProperty(key)).append("\n");
    		}
    		int length = 0;
    		return (length = formatResult.length()) > 0 ? 
    				formatResult.substring(0, length - 1) : "";
    	}
    
    }
    package com.daniele.appdemo.util;
    
    public class StringUtils {
    	
    	public static boolean isNullOrBlank(String str) {
    		return str == null || str.length() == 0;
    	}
    	
    	public static boolean isNotNullOrBlank(String str) {
    		return !isNullOrBlank(str);
    	}
    
    }

    运行时,依次启动SenvProtocolServer和SenvProtocolClient类即可。

     

    展开全文
  • 2.URL中常见的协议(1)HTTP: 超文本传输协议,访问的是远程的网络资源,格式是http://,http协议是在网络开发中最常见的协议(2)file:访问的是本地计算机上的资源,格式是file://(不用加主机地址)(3)mailto:访问的...
        

    一.URL 

    1.基本介绍 
    URL的全称是Uniform Resource Locator(统一资源定位符) ,通过1个URL,能找到互联网唯一的1个资源 ,URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL 
    这里写图片描述

     

    2.URL中常见的协议 
    (1)HTTP:  超文本传输协议,访问的是远程的网络资源,格式是http:// ,http协议是在网络开发中最常见的协议 
    (2)file :访问的是本地计算机上的资源,格式是file://(不用加主机地址) 
    (3)mailto :访问的是电子邮件地址,格式是mailto: 
    (4)FTP :访问的是共享主机的文件资源,格式是ftp://

     

    二.HTTP协议 

    1.HTTP协议简介 :不管是移动客户端还是PC端,访问远程的网络资源经常使用 HTTP协议

     

    2.HTTP协议的作用  HTTP的全称是Hypertext Transfer Protocol,超文本传输协议 

      (1)规定客户端和服务器之间的数据传输格式 
      (2)让客户端和服务器能有效的进行数据沟通 
    这里写图片描述

     

    3.为什么选择使用HTTP? 
      (1)简单快速 因为HTTP协议简单,所有HTTP服务器的程序规模小,因而通信速度很快 
      (2)灵活 HTTP允许传输任意类型的数据 
      (3)HTTP 0.9和1.0使用非常持续链接 限制每次链接只处理一个请求,服务器对客户端的请求做出响应后,马上断开链接,这种方式可以节省传输时间


    4.HTTP的通信过程 :要想使用HTTP协议向服务器索取数据,得先了解HTTP通信的完整过程 ,完整的http通信可以分为2大步骤 
      (1)请求:客户端向服务器索要数据 
      (2)响应:服务器返回客户端响应的数据 
    这里写图片描述


    三.HTTP通信过程-请求和响应 

    1.HTTP通信过程-请求  HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容 
    请求行:包含了请求方法,请求资源路径,HTTP协议版本 
    GET 
    /MJServer/resources/images/1.jpg 
    HTTP/1.1 

    请求头:包含了对客户端的环境描述,客服端请求的主机地址等信息 
    Host:192.168.1.105:8080 //客户端想访问的服务器主机地址 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境 
    Accept: text/html, /// 客户端所能接收的数据类型 
    Accept-Language: zh-cn // 客户端的语言环境 
    Accept-Encoding: gzip // 客户端支持的数据压缩格式 
    请求体:客户端发给服务器的具体数据,比如文件数据

     

    2.HTTP通信过程-响应 :客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端 ,HTTP协议规定: 1个完整的HTTP响应中包含以下内容: 
    状态行:包含了HTTP协议版本,状态码,状态英文名称 
    HTTP/1.1 
    200 
    OK 

    响应头:包含了对服务器的描述,对返回数据的描述 
    Server: Apache-Coyote/1.1 // 服务器的类型 
    Content-Type: image/jpeg // 返回数据的类型 
    Content-Length: 56811 // 返回数据的长度 
    Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间 

    实体内容:服务器返回给客户端的具体数据,比如文件数据 
    这里写图片描述


    3.补充:推荐工具firebug-1.12.5-fx.xpi   虫子的作用:拦截所有的http请求


    4.常见的响应状态码 
    这里写图片描述


    四.发送HTTP请求的方法 

    1.简单说明 : 在HTTP/1.1协议中,定义了8种发送http请求的方法 
    Get,Post,Options,Head,Put,Delete,Trace,Connect,Patch 

    2.get和post请求 ,要想使用Get和Post请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号,密码 ,Get和Post对比: 

    Get :在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开。 注意:由于浏览器和服务器对URL长度有限,因此在URL后面附带的参数是有限期的,通常不能超过1KB 
    Post :发给服务器的参数全部放在请求体中 ,理论上,Post传递的数据量没有限制(具体还得看服务器的处理能力)

     

    3.Get和Post的选择  选择Get和Post的建议 
      (1)如果要传递大量数据,比如文件上传,只能用Post请求 
      (2)Get的安全性比Post要差些,如果包含机密/敏感信息,建议用Post 
      (3)如果仅仅要索取数据(数据查询),建议使用Get 
      (4)如果是增加,修改,删除数据,建议使用Post

     

    4.ios中发送HTTP请求的方案  在iOS中,常见的发送HTTP请求(Get和Post)的解决方案有 

    (1)苹果原声(自带) 
    NSURLConnection:用法简单,最古老最经典最直接的一种方案 
    NSURLSession:ios7新出的技术,功能比NSURLConnection更加强大 
    CFNetwork:NSURL*的底层,纯C语言 

    (2)第三方框架 
    ASIHttpRequest:外号”HTTP终结者”,功能及其强大,可惜早已停止更新 
    AFNetworking:简单易用,提供了基本够用的常用功能

     

    5.ASI和AFN架构对比 
    这里写图片描述 
    说明:AFN基于NSURL,ASI基于CFHTTP,ASI的性能更好一些。

    展开全文
  • JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类: 1.java.net.URL:URL资源 2.java.net.URLConnection:各种URL资源连接...
  • 常见URL协议

    2017-01-12 16:01:00
    常见URL协议: http(s):// 超文本传输协议 ftp:// 传输文件协议 file:// 获取本地文件协议 ...注意:浏览器会自动补全协议头,但在做客户端的网络开发时,必须加上正确的协议头。 safari和c...
  • Linux网络管理员手册(8) 第八章 点对点协议 PTP PPP LCP (转)[@more@]Linux网络管理员手册(8) 2000-07-29 10:40 发布者:Mailto.NETbull@21cn.com">...
  • 2015.9.28-http协议

    2015-09-29 10:33:00
    http:超文本传输协议,访问远程网络资源,最常用的网络协议 file:本地计算机资源 mailto:电子邮件地址 ftp:共享主机文件资源 二,http协议作用 三,http协议优势 简单快速,通信速度快,允许传输...
  • tcp/ip 协议(网络四层): 应用层、传输层、网络层、数据链路层 应用层 http ,ftp ,dns , sip ,voIp,mailto,telnet 传输层 TCP/UDP:tcp 在传输成进行http数据分包 HTTP 1.0/1.1/2.0 中使用的是TCP 传输 3.0中使用...
  • 网络

    2016-04-06 17:21:07
    一、URL 1、URL Uniform Resource Locator(统一... 常见协议:HTTP\FTP\mailto\File\ tel:// \ sms:// } 二、HTTP协议 1、HTTP HyperText Transport Protocol(超文本协议) { 浏览器和Web服务器通许时遵守的约定 }
  • 协议:常用的http,https,ftp(文件传输协议),file(读取计算机本地文件),mailto(发送邮件) 服务器主机的地址:可以是主机名,可以是域名,或者是ip地址。 端口:默认不展示端口号,但是会有默认的端口号,...
  • http(hypertext transfer protocol):http协议类型,同理,还可能是ftp和mailto协议。 80是http的默认端口号,因此可以省略。(注:https的默认端口号是443,同样可以省略) 域名后面指定的是文件的路径名,如果...
  • DNS查询IP地址 DNS工作方式 委托协议栈发送消息 ... 了解URL的地址格式 ...协议类型:http ftp mailto 浏览器解析URL过程 浏览器会按照URL元素进行解析成©的情况 3.HTTP的基本思路 请求消息中包含...
  • url组成部分 ://:@:/;?# scheme 协议方案 http #超文本转移协议,我们浏览网站都是这个 ...mailto #通过该链接可以在Internet中发送邮件 ftp #文件传输协议,传输文件 rtsp.rtspu #这
  • 【摘要】前面说过,urllib库里还提供...它支持如下协议的URL处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、 sip、sips、snews、svn、svn+ssh、...
  • Python网络爬虫(二)

    2018-03-06 23:40:00
    Urllib库之解析链接 Urllib库里有一个parse这...它支持如下协议的 URL 处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、 sip、sips、sne...
  • URL最常出现在参考网页(http)上,但也是 用于文件传输(ftp),电子邮件(mailto),数据库访问(JDBC)和许多其他应用程序。 大多数网络浏览器在地址栏中在页面上方显示网页的URL。 典型的URL可以采用...
  • 它支持如下协议的 URL 处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、 sip、sips、snews、svn、svn+ssh、telnet 和 wais。本节中,我们介绍...
  • URL开头可能有http,ftp,file,mailto,省略文件名,服务器根据配置默认文件,多数为index或者default URI内容是存放网页数据的文件名或者一个CGI程序,一般get文件,post程序,还有put,delete等等操作服务器 ...
  • 知识点:l URL、URIl HTTP基本思路l DNS域名解析l 协议栈和socket简介 1、 URL的结构网址叫URL(Uniform Resource Locator,统一资源定位符)。由“http:”、“ftp:”、“file:”、“mailto:”等开头,分别表示...
  • 1. 简述 1.1 URI 统一资源标识符(Uniform Resource Identifier, URI)采用一种特定语法标识一个资源的字符串 语法: 模式:模式特定部分 模式包括: data 链接中直接包含的...mailto 电子邮件地址 telnet 基
  • 【摘要】前面说过,urllib库里还提供...它支持如下协议的URL处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、 sip、sips、snews、svn、svn+ssh、...
  • Urllib 库里还提供了 parse 这个...它支持如下协议的 URL 处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、 sip、sips、snews、svn、sv...
  • 计算机网络基础知识---之读书笔记

    千次阅读 2017-09-20 14:22:27
    相信大家对网址肯定耳熟能详了,网址,准确来说应是URL(统一资源定位符),例如:http://www.csdn.net/ 其中URL开头的字符,即“http:”“ftp:”“file:”“mailto:”这部分字符都表示浏览器应该使用的访问方法...
  • Urllib 库里还提供了 parse 这个...它支持如下协议的 URL 处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、 sip、sips、snews、svn、sv...
  • 使用HTTP协议访问Web服务器时 浏览器访问Web服务器时,依赖的是网址,即URL(统一资源定位符)。http://user:password@www.glasscom.com:80/dir/file1.htm是较为详尽的URL。 http表示浏览器使用的访问方法(还有ftp...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

网络协议mailto