一个基于SSL的简单浏览器(使用Swing)

来源:互联网 发布:linux系统内核参数 编辑:程序博客网 时间:2024/06/06 18:16

//代码如下

import javax.swing.text.*;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.swing.*;


import java.net.*;
import java.io.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.text.html.*;
import java.beans.*;


public class SimpleWebBrowser extends JFrame implements HyperlinkListener,ActionListener{
  private JTextField jtf=new JTextField(80); 
  private JEditorPane jep=new JEditorPane();
  private String initialPage="";
  private String host="localhost";
  private int port=8888;
  private SSLSocket socket;
  public SimpleWebBrowser(String title) throws IOException{
    super(title);
    
    jtf.setText("");
    jtf.addActionListener(this);
    jep.setEditable(false);
    jep.addHyperlinkListener(this);  
    //监听editorKit属性被重新设置的事件
    jep.addPropertyChangeListener("editorKit", new PropertyChangeListener(){//注册一个PropertyChangeListener
      public void propertyChange(PropertyChangeEvent evt){
        EditorKit kit = jep.getEditorKit();
          if(kit.getClass() == HTMLEditorKit.class) {
            ((HTMLEditorKit)kit).setAutoFormSubmission(false);//按手工方式提交表单
          }
        }
      });


    JPanel northPanel = new JPanel();///////////////////////////////////////
    add(northPanel, BorderLayout.NORTH);
    JButton solidButton = new JButton("网址:");//按钮
    JButton searchButton = new JButton("浏览");
    northPanel.add(solidButton);
    northPanel.add(jtf);;
    northPanel.add(searchButton);
    add(new JScrollPane(jep));


    
    
    
    searchButton.addActionListener(new ActionListener() {////////////点击按钮
@Override
public void actionPerformed(ActionEvent e) {
try {
initialPage=jtf.getText();///////////////将url中的网址放入

try {
communicate();//握手
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//String info="http://www.javathinker.org";
jep.setPage(initialPage);//?/////发送请求,接受响应并·解析网页
} catch (IOException e1) {
showError(initialPage);
}

}
});//关闭按钮
    
    pack();//自适应
setVisible(true);//可视化
setBounds(100,200,1100,700);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
  }
    
  public void showError(String url){
     jep.setContentType("text/html"); 
     jep.setText("<html>无法打开网页:"+url+"。输入的URL不合法,或者网页不存在。</html>");
  }


  public static void main(String[] args) throws IOException{
    SimpleWebBrowser browser=new SimpleWebBrowser("浏览器");
  }
  
  public void actionPerformed(ActionEvent evt){
    try{
      jep.setPage(jtf.getText());
      System.out.println("4");
    }catch(Exception e){
       showError(jtf.getText());
    }
  }
  /** 处理用户选择超级链接或者提交表单事件 */
  public void hyperlinkUpdate(HyperlinkEvent evt){
    try{ 
      if (evt.getClass() == FormSubmitEvent.class) {  //处理提交表单事件
        FormSubmitEvent fevt = (FormSubmitEvent)evt;
        URL url=fevt.getURL(); //获得URL
        String method=fevt.getMethod().toString(); //获得请求方式
        String data=fevt.getData(); //获得表单数据
       
        if(method.equals("GET")){  //如果为GET请求方式
           jep.setPage(url.toString());
           jtf.setText(url.toString()); //把文本框设为用户选择的超级链接
        }else if(method.equals("POST")){  //如果为POST请求方式
           URLConnection uc=url.openConnection(); 
           //发送HTTP响应正文
           System.out.println("1");
           uc.setDoOutput(true);//设置是否可以获得输出流
           OutputStreamWriter out=new OutputStreamWriter(uc.getOutputStream()); 
           out.write(data);
           //System.out.println(data);
           out.close();
          
           //接收HTTP响应正文    
           InputStream in=uc.getInputStream();
           ByteArrayOutputStream buffer=new ByteArrayOutputStream();
           byte[] buff=new byte[1024];  
           int len=-1;


           while((len=in.read(buff))!=-1){
             buffer.write(buff,0,len);
           }
           in.close();
          // System.out.println("2");
           jep.setText(new String(buffer.toByteArray()));
           jtf.setText(url.toString()); //把文本框设为用户选择的超级链接  
        }
      }else if(evt.getEventType()==HyperlinkEvent.EventType.ACTIVATED){  //处理用户选择的超级链接
        
     System.out.println("3");
        jep.setPage(evt.getURL());
        jtf.setText(evt.getURL().toString()); //把文本框设为用户选择的超级链接 
      } 
      
    }catch(Exception e){
       showError(evt.getURL().toString());
    }
  }
  //**************************




 public void communicate()throws Exception{////////////////////////////////////////////
 System.setProperty("javax.net.ssl.trustStore", "D:\\myeclipse2016_workSpace\\SSLWeb\\test.keys");
   SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
   socket=(SSLSocket)factory.createSocket();
   SocketAddress remoteAddr=new InetSocketAddress(host, port);
   socket.connect(remoteAddr);
   
   String[] supported=socket.getSupportedCipherSuites();
   socket.setEnabledCipherSuites(supported);
   System.out.println(socket.getUseClientMode()? "客户模式":"服务器模式");
   StringBuffer sb=new StringBuffer("GET "+"/"+" HTTP/1.1\r\n");
   sb.append("Host: localhost\r\n");
   sb.append("Accept: */*\r\n");
   sb.append("Accept-Language: zh-cn\r\n");
   sb.append("Accept-Encoding: gzip, deflate\r\n");
   sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n");
   sb.append("Connection: Keep-Alive\r\n\r\n");
   //发出HTTP请求
   OutputStream socketOut=socket.getOutputStream();//SSL就在握手
   socketOut.write(sb.toString().getBytes());//SSL就在握手
      
   BufferedReader br=getReader(socket);
   String data;
   while((data=br.readLine())!=null){
     System.out.println(data);
     
   }
       
  // socket.close();
 }
 private PrintWriter getWriter(SSLSocket socket)throws IOException{
   OutputStream socketOut = socket.getOutputStream();
   return new PrintWriter(socketOut,true);
 }
 private BufferedReader getReader(SSLSocket socket)throws IOException{
   InputStream socketIn = socket.getInputStream();
   return new BufferedReader(new InputStreamReader(socketIn));
 }
}   


//结果


0 0
原创粉丝点击