当前位置:   article > 正文

Socket http和https的使用区别_sslsocket和socket区别

sslsocket和socket区别

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 });
   }
}


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/309399
推荐阅读
相关标签
  

闽ICP备14008679号