`

java学习笔记:模拟浏览器,访问网址

    博客分类:
  • java
阅读更多


 

/*
使用UI界面,输入url地址,访问指定端口的服务
1.当不输入端口时,默认访问80端口
2.可以访问服务器指定端口和指定路径下的文件


  关于对url的处理
  我们先来手动截取一下,不要怕麻烦
  java类中其实有相应的方法的

  本例中网页代码没解析
  
[示例]:模拟浏览器,访问网址
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class Demo
{
  public static void main(String[] args) throws Exception
  {
    new MyWindow();
  }

  public static void sop(Object obj) //打印
  {
    System.out.println(obj);
  }
}

class MyWindow
{
  private Frame frm;
  private TextField textd;
  private Button but;
  private TextArea texta;
  private Dialog dlg;  //对话框应该在需要的时候再初始化
  private Label lab;
  private Button okButn;
  
  MyWindow() //构造方法
  {
    init();  //初始化
  }
  
  public void init() //初始化
  {
    frm= new Frame("window");        //创建窗体
    frm.setBounds(300,100,600,500);  //距左300,距上100,横向600,纵向500
    frm.setLayout(new FlowLayout()); //界面模式:边界模式
    
    textd = new TextField(60);       //创建单行文本框
    but= new Button("转到");         //创建按钮
    texta = new TextArea(27,82);     //创建文本区域
    
    dlg = new Dialog(frm,"提示:对话框!",true); //创建对话框
    lab = new Label("请正确网址或路径!");      //创建标签.可后期设置文本
    okButn = new Button("确定!!!");            //创建弹出对话框中的"确定"按钮
    
    dlg.setBounds(400,200,300,100);            //设置对话框坐标
    dlg.setLayout(new FlowLayout());           //设置对话框界面为边界模式
      
    dlg.add(lab);                              //在对话框中加入组件标签和按钮
    dlg.add(okButn);
    
    frm.add(textd);                            //在窗体中加入组件
    frm.add(but);
    frm.add(texta);

    myEvent();                                 //初始化事件监听器
    frm.setVisible(true);
  }

  private void showSerData() throws Exception
  { 
    texta.setText("");                //将区域文本清空
    String urlStr = textd.getText();  //获取地址栏中的字符串
    if(urlStr.equals(""))             //如果地址栏为空,弹出提示框
    {
      texta.setText("请输入网址");  
      String worningInfo = "请输入网址";
      lab.setText(worningInfo);
      dlg.setVisible(true);           //显示提示框
      return;                                                   
    }  
    
    if(!urlStr.endsWith("/"))
    {
      urlStr=urlStr+"/";              //如果地址没有斜杠就添加
    }

    int index1=urlStr.indexOf("//")+2;     //从指定字符串开始索引,加2后就是ip开始了
    int index2=urlStr.indexOf("/",index1); //从index1开始取,也就是从host开始
    String str= urlStr.substring(index1,index2);// www.tom.com:80
    sop("str: "+str);
    int port=0;
    String host=null;
    String path=null;
    if(!str.contains(":"))            //如果只写host,未写端口号
    {
      host=str;
      port=80;
      path="";
    }
    else                              //如果指定host地址和端口,或者还加了路径
    {
      String hostPort[] =str.split(":"); //分割出host地址和端口号
      host=hostPort[0];
      port =Integer.parseInt(hostPort[1]);
      path = urlStr.substring(index2+1); //路径不包含最左边的斜杠,  /C:/webpages   
    }
    sop(host+port+path);
    client(host,port,path); //网址处理完毕,准备发送
  }
  
  public void client(String host,int port,String path) throws Exception
  {
    Socket sock = new Socket(host,port); //准备向服务端发送浏览器请求
    PrintWriter priOut= new PrintWriter(sock.getOutputStream(),true);
    priOut.println("GET /"+path+" HTTP/1.1");
    priOut.println("Accept: */*");
    priOut.println("Accept-Language: zh-cn");
    priOut.println("Accept-Encoding: gzip, deflate");
    priOut.println("Host: 这个随便写");
    priOut.println("Connection: Keep-Alive");
    priOut.println(); //空行
    
    sop("向服务端请求完毕>>>>>>>>>>>>>>>>>>>>>>>>>>");
    sop("准备接受服务端数据......................");
    
    //接收服务器返回的信息
    BufferedReader bufr = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    BufferedWriter bufw = new BufferedWriter(new FileWriter("c:\\rrr.txt"));//写到硬盘上
    String lineIn=null;
    while(true)
    {
      lineIn=bufr.readLine();
      if(lineIn!=null)
      {
        bufw.write(lineIn);//写到rrr.txt中
        bufw.newLine();
        texta.append(lineIn+System.getProperty("line.separator")); //UI界面中的显示
        sop(lineIn);//控制台也打印下
      }
      else
      {
        break;
      }
    }
    bufw.flush();
    bufw.close();
    sock.close();
  }
  
  private void myEvent()      //为各个事件源组件添加事件监听器
  {
    okButn.addActionListener  //命令按钮活动事件监听器
    (
      new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        { 
          dlg.setVisible(false); //隐藏对话框
          textd.setText("");
          texta.setText("");
        }

      }
    );
    
    dlg.addWindowListener//.对话框窗体监听器
    (
      new WindowAdapter()
      {
        public void windowClosing(WindowEvent e) //点击对话框的叉叉后
        {
          
          dlg.setVisible(false);  //隐藏对话框
          textd.setText("");
          texta.setText("");
        }
      }
    );
  
    but.addActionListener         //"转到" 按钮活动监听器
    (
      new ActionListener()
      {      
        public void actionPerformed(ActionEvent e)  //只有这一个方法要覆盖
        { 
          try
          {
          showSerData();  
          }
          catch(Exception e2)
          {}
        }
      }  
    );
       
    frm.addWindowListener         //窗体监听器
    (
      new WindowAdapter()
      {
        public void windowClosing(WindowEvent e)
        {
          System.exit(0);
        }
      }
    );
    
    //如果我们不想用鼠标点击"转到"按钮,想直接按回车就完成操作?
    //什么是事件源?   是textd组建  ,因为此时焦点还在textd单行文本框中
    textd.addKeyListener
    (
      new KeyAdapter()
      {
        public void keyPressed(KeyEvent e) 
        {
          if(e.getKeyCode()==KeyEvent.VK_ENTER) //按回车
          {
            try
            {
              showSerData();
            }
            catch(Exception e1)
            {}
          }
        }
      }
    );

  }
  
  public static void sop(Object obj) //打印
  {
    System.out.println(obj);
  }
}

 

  • 大小: 41.8 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics