Socket http和https的使用区别

简介: https(Secure Hypertext Transfer Protocol)安全超文本传输协议,使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版(https=SSL+HTTP)。

http和https的使用区别


  https(Secure Hypertext Transfer Protocol)安全超文本传输协议,使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版(https=SSL+HTTP)。


 端口不同:http是80,https是443。默认都省略。


   https需要证书,但要花钱。所以申请360网站卫士SSL证书,该证书只可以在网站卫士接入期间使用,默认网站卫士不主动将访问从HTTP跳转到HTTPS。此时源站不需要支持HTTPS,我们系统回源走HTTP(半程加密)

   使用https会使网站访问速度变慢,但是会更安全。假如为了安全保密,将一个网站所有的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该网站的性能和效率将会大大降低,而且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别,所以,我们只需对那些涉及机密数据的交互处理使用HTTPS协议,这样就做到鱼与熊掌兼得。总之不需要用https 的地方,就尽量不要用。


  对于同时支持HTTPS和HTTP的资源,引用的时候要把引用资源的URL里的协议头去掉,例如://www.example.com/scirpt.js,这样相当于相对路径,即浏览器会自动根据当前是HTTPS还是HTTP来给资源URL补上协议头的,可以达到无缝切换。如果是站内资源,最好是HTTP和HTTPS各一份,然后再通过相对路径的方式引用,这样就可以完美的解决掉这个问题了。


http


80端口http默认端口


Socket socket = new Socket(InetAddress.getByName(url.getHost()), 80);


https


443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。


Socket socket =  (SSLSocket)((SSLSocketFactory)SSLSocketFactory.getDefault()).createSocket(InetAddress.getByName(url.getHost()), 443);  


其他保持一致

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Calendar;
import java.util.Locale;
import java.util.Map;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import com.rl.mobile.entity.FormFile;
import android.text.format.DateFormat;
/**
 * 上传文件到服务器
 * 
 * @author Administrator
 *
 */
public class SocketHttpRequester {
   //https 用这个 http用上面的 本项目目前只用到https所以上面的可注销
   public static boolean postSSLSocketFactory(String path, Map<String, String> params, FormFile[] files) throws Exception {
      String BOUNDARY = "---------------------------7da2137580612"; //boundary就是request头和上传文件内容的分隔符  
      final String endline = "--" + BOUNDARY + "--\r\n";// 数据结束标志
      int fileDataLength = 0;
      String name=DateFormat.format("yyyyMMddhhmmss",Calendar.getInstance(Locale.CHINA))+"";
      for (FormFile uploadFile : files) {// 得到文件类型数据的总长度
          StringBuilder fileExplain = new StringBuilder();
             fileExplain.append("--");
             fileExplain.append(BOUNDARY);
             fileExplain.append("\r\n");
             name = DateFormat.format("yyyyMMddhhmmss",Calendar.getInstance(Locale.CHINA))+"."+getExtensionName(uploadFile.getFilname());
             fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ name + "\"\r\n");
             fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
             fileExplain.append("\r\n");
             fileDataLength += fileExplain.length();
            if(uploadFile.getInStream()!=null){
                fileDataLength += uploadFile.getFile().length();
             }else{
                 fileDataLength += uploadFile.getData().length;
             }
      }
      StringBuilder textEntity = new StringBuilder();
      for (Map.Entry<String, String> entry : params.entrySet()) {// 构造文本类型参数的实体数据
          textEntity.append("--");
            textEntity.append(BOUNDARY);
            textEntity.append("\r\n");
            textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
            textEntity.append(URLEncoder.encode(MStringUtils.getSpecial(entry.getValue()), "UTF-8"));
            textEntity.append("\r\n");
      }
      // 计算传输给服务器的实体数据总长度
      int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;
      URL url = new URL(path);
      int port = 443;
      Socket socket = (SSLSocket)((SSLSocketFactory)SSLSocketFactory.getDefault()).createSocket(InetAddress.getByName(url.getHost()), 443);  
      OutputStream outStream = socket.getOutputStream();
      // 下面完成HTTP请求头的发送
      String requestmethod = "POST " + url.getPath() + " HTTP/1.1\r\n";
      outStream.write(requestmethod.getBytes());
      String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
      outStream.write(accept.getBytes());
      String language = "Accept-Language: zh-CN\r\n";
      outStream.write(language.getBytes());
      String site = "site:"+Constant.SITE+"\r\n";
      outStream.write(site.getBytes());
      String authorize = "authorize:"+Constant.AUTHORIZE+"\r\n";
      outStream.write(authorize.getBytes());
      String contenttype = "Content-Type: multipart/form-data;boundary=" + BOUNDARY + "\r\n";
      outStream.write(contenttype.getBytes());
      String contentlength = "Content-Length: " + dataLength + "\r\n";
      outStream.write(contentlength.getBytes());
      String alive = "Connection: Keep-Alive\r\n";
      outStream.write(alive.getBytes());
      String host = "Host: " + url.getHost() + ":" + port + "\r\n";
      outStream.write(host.getBytes());
      // 写完HTTP请求头后根据HTTP协议再写一个回车换行
      outStream.write("\r\n".getBytes());
      // 把所有文本类型的实体数据发送出来
      outStream.write(textEntity.toString().getBytes());
      // 把所有文件类型的实体数据发送出来
      for (FormFile uploadFile : files) 
      {
           StringBuilder fileEntity = new StringBuilder();
                fileEntity.append("--");
                fileEntity.append(BOUNDARY);
                fileEntity.append("\r\n");
                fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ name + "\"\r\n");
                fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
                outStream.write(fileEntity.toString().getBytes());
                if(uploadFile.getInStream()!=null){
                    byte[] buffer = new byte[1024];
                    int len = 0;
                    while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
                        outStream.write(buffer, 0, len);
                    }
                    uploadFile.getInStream().close();
                }else{
                    outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
                }
                outStream.write("\r\n".getBytes());
      }
      // 下面发送数据结束标志,表示数据已经结束
      outStream.write(endline.getBytes());
      BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      if (reader.readLine().indexOf("200") == -1) {// 读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
         return false;
      }
      outStream.flush();
      outStream.close();
      reader.close();
      socket.close();
      return true;
   }
   /* 
    * Java文件操作 获取文件扩展名 
    *  
    */   
   public static String getExtensionName(String filename)
   {    
      if ((filename != null) && (filename.length() > 0))
      {    
         int dot = filename.lastIndexOf('.');    
         if ((dot >-1) && (dot < (filename.length() - 1)))
         {    
              return filename.substring(dot + 1);    
         }    
      }    
      return filename;    
   }    
   /**
    * 提交数据到服务器
    * 
    * @param path
    *            上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://
    *            www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
    * @param params
    *            请求参数 key为参数名,value为参数值
    * @param file
    *            上传文件
    */
   public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception {
      return postSSLSocketFactory(path, params, new FormFile[] { file });
   }
}
相关文章
|
6天前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
6天前
|
应用服务中间件 网络安全 nginx
Client sent an HTTP request to an HTTPS server
Client sent an HTTP request to an HTTPS server
13 0
|
6天前
|
网络协议 网络安全 程序员
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
|
6天前
|
安全 网络协议 网络安全
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
HTTP和HTTPS是互联网主要的两大协议,HTTP是基础的简单请求-响应协议,常用于TCP上,但数据传输不安全。HTTPS是HTTP的安全版本,添加了SSL层进行加密和身份验证,提供更高的安全性,用于保护数据和验证网站真实性。HTTPS需CA证书,可能产生费用,并使用443端口而非HTTP的80端口。
|
6天前
|
网络协议 安全 数据安全/隐私保护
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
SOCKS5和HTTP是两种代理协议,前者是通用型,支持多种网络流量,提供身份验证、IPv6支持及UDP兼容性,更适合实时数据传输。HTTP代理专用于HTTP协议,适用于Web资源请求。SOCKS5在传输方式、功能、兼容性和安全性上更胜一筹,而HTTP代理则在处理HTTP请求时更专业。选择代理协议应根据需求和应用场景,考虑服务的稳定性和安全性。付费代理如kookeey全球代理,支持双协议,速度快且可扩展性强,是可靠的选择。
|
6天前
|
缓存 安全 算法
网络原理 HTTP _ HTTPS
网络原理 HTTP _ HTTPS
15 0
|
6天前
|
安全 网络协议 算法
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
|
6天前
|
网络协议 安全 算法
HTTP协议与HTTPS协议
HTTP协议与HTTPS协议
|
6天前
|
数据采集 缓存 网络协议
静态代理IP是否支持HTTP和HTTPS?
静态代理IP支持HTTP、HTTPS、FTP、Socks5等协议,HTTP协议因其简单、灵活而常用,通常比HTTPS速度快,因无需加密处理。HTTP代理比SOCKS5代理通常更快,因为HTTP专注于HTTP请求,而SOCKS5处理多种网络流量。静态HTTP代理适合浏览器和爬虫,SOCKS5代理支持更多协议,如TCP、UDP。选择取决于应用场景和需求。
|
6天前
|
网络协议 安全
【专栏】`curl`是广泛用于网络编程和自动化脚本的命令行工具,支持HTTP、HTTPS等协议
【4月更文挑战第28天】`curl`是广泛用于网络编程和自动化脚本的命令行工具,支持HTTP、HTTPS等协议。在处理大文件或慢速服务器时,设置超时参数至关重要。本文介绍了`curl`的超时参数,如`-m`(最大操作时间)、`-c`(连接超时)、`--dns-timeout`(DNS解析超时)和`-t`(时间条件)。通过示例展示了如何设置这些超时,并提到了一些高级技巧和注意事项,如错误处理和带宽限制。合理设置超时能提高效率和可靠性,对编写健壮的自动化脚本非常有用。