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 });
   }
}
相关文章
|
4月前
|
XML JSON API
识别这些API接口定义(http,https,api,RPC,webservice,Restful api ,OpenAPI)
本内容介绍了API相关的术语分类,包括传输协议(HTTP/HTTPS)、接口风格(RESTful、WebService、RPC)及开放程度(API、OpenAPI),帮助理解各类API的特点与应用场景。
|
4月前
|
Android开发 Kotlin
|
4月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
548 2
|
5月前
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
519 16
|
5月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
2093 3
|
6月前
|
安全 网络安全 数据安全/隐私保护
网页安全演进:HTTP、HTTPS与HSTS
这整个进程实质上是网页安全由“裸奔”到“穿衣”再到“绑带”的演变史。它保障了数据的机密性和完整性,降低了中间人攻击的风险,最终实现了更自由、更安全的网络环境。但别忘了,技术永远在发展,网络安全的赛跑也永无终点。*ENDPOINT*
402 11
|
7月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
210 18
|
7月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
709 20
|
7月前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
263 1
|
7月前
|
缓存 搜索推荐 CDN
HTTP缓存策略的区别和解决的问题
总的来说,HTTP缓存策略是一种权衡,需要根据具体的应用场景和需求来选择合适的策略。理解和掌握这些策略,可以帮助我们更好地优化网页性能,提高用户的浏览体验。
216 11