网络编程3

3、客户端和服务的浏览器

    浏览器大家都熟悉,常见的有
    客户端:浏览器(telent)
    服务器:tomcatapach  IIS

思路:在本地计算器建立端口,接收客户端的请求
代码:

package org.nagi.net;
import java.io.*;
import java.net.*;

/**
 * 类似于Tomcat 服务器
 * @authordell
 *
 */
class ServerDemo{
   publicstatic void main(String[] args)throws Exception {
      //创建服务,监听端口
      ServerSocketss=new ServerSocket(12345);
      //获取客户端
      Sockets=ss.accept();
      //显示ip
      Stringip=s.getInetAddress().getHostAddress();

      //读取客户端读取流数据
      InputStreamin=s.getInputStream();

      byte[]buf=new byte[1024];
      intlen=in.read(buf);
      //显示数据
      System.out.println(newString(buf,0,len));
      //返回信息写入客户端输出流
      PrintWriterout=new PrintWriter(s.getOutputStream(),true);///true一定要记得写

      out.println("<fontcolor='red' size='6'>这是自定义的浏览器</font>");

      s.close();//关流
      ss.close();
   }
}

运行结果:

GET /HTTP/1.1
Accept:*/*
Accept-Language:zh-CN //字符
User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; 2345Explorer3.5.0.12816)
Accept-Encoding:gzip, deflate
Host:localhost:12345 //端口号
Connection:Keep-Alive
Cookie:c_mobile=

浏览器输出的结果
这是自定义的浏览器

自定义一个浏览器客户端

packageorg.nagi.net;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.net.Socket;
importjava.net.UnknownHostException;

/**
 *模拟一个IE浏览器
 */
publicclass MyIE {

   publicstaticvoid main(String[] args) {
      try {
        //接连到本机12345端口上
        Socket s = new Socket("127.0.0.1",12345);
        //打开一个打印流
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);

        out.print("GET myweb/demo.html/ HTTP/1.1");
        out.print("Accept: */*");
        out.print("Accept-Language: zh-CN");
        out.print("Host: localhost:12345");
        out.print("Connection: Keep-Alive");

        out.close();//关闭流
        s.close();
      } catch (UnknownHostException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
   }
}

4、URL模拟百度新浪浏览器

URL:表示一个统一资源标识符 (URI) 引用。
URI 语法和组成部分
在最高级别上,字符串形式的 URI 引用(以下简写为”URI”)语法如下
[scheme:]scheme-specific-part[#fragment]
其中,方括号 […] 用于描述可选组成部分,字符 : 和# 代表它们自身。
绝对 URI 指定了方案(scheme);非绝对的 URI 称为相对URI。URI 还可以根据其是否为不透明的 或分层的 进行分类。

不透明 URI 为绝对 URI,其特定于方案的部分不是以斜线字符 (‘/’) 开始。不透明 URI 无法进行进一步解析。下面是不透明 URI 的一些示例:

mailto:java-net@java.sun.com

news:comp.lang.java

urn:isbn:096139210x

URI、URL和 URN
URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。

URL常见的方法
URI(String str) 
  通过解析给定的字符串构造一个 URI。
URI(String scheme, String ssp,String fragment)
  根据给定的组成部分构造 URI。
URI(String scheme, String userInfo,String host, int port,String path,String query,String fragment)
  根据给定的组成部分构造一个分层 URI。
URI(String scheme, String host,String path,String fragment)
  根据给定的组成部分构造分层 URI。
URI(String scheme, String authority,String path,String query,String fragment)
  根据给定的组成部分构造分层 URI。

思路:使用URL已经封装地址头信息和地址字段解析信息
代码:

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

/**
 *使用URL封装地址信息解析包
 *@author dell
 *
 */
class MyIEGUI {
   // 定义所需组件引用
   private Framef;
   private Buttonbut;
   private TextFieldtf;
   private TextAreata;

   // 构造函数
   MyIEGUI() {
      init();
   }

   // 窗体基本设置于功能实现
   publicvoid init() {
      // 组件实例化
      f = new Frame("IE浏览器");
      but =new Button("enter");
      tf = new TextField(50);
      ta = new TextArea(25, 60);

      // 基本设置
      f.setBounds(300, 150, 500, 500);
      f.setLayout(new FlowLayout());

      // 添加组件
      f.add(tf);
      f.add(but);
      f.add(ta);

      // 窗体事件
      myEvent();

      // 窗体显示
      f.setVisible(true);
   }

   // 注册事件
   publicvoid myEvent() {
      // 窗体关闭功能
      f.addWindowListener(newWindowAdapter() {
        publicvoid windowClosing(WindowEvent e) {
          System.exit(0);
        }
      });

      // “跳转”按钮事件
      but.addActionListener(new ActionListener() {
        publicvoid actionPerformed(ActionEvent e) {
          showFile();// 显示网页内容在文本区中
        }
      });

      // 文本框键盘事件
      tf.addKeyListener(new KeyAdapter() {
        publicvoid keyPressed(KeyEvent e) {
          // 如果键盘按下Enter键,就将网页内容显示在文本区中
          if (e.getKeyCode() == KeyEvent.VK_ENTER)
             showFile();
        }
      });
   }

   /**
    * 显示网页信息
    * 解析地址信息头
    */
   privatevoid showFile() {
      ta.setText("");
      String path = tf.getText();//获取输入的路径
      try {
        // 封装地址对象 解析地址信息
        URL url = new URL(path);
        // 连接网页服务器
        URLConnection conn = url.openConnection();
        // 读取流,用于读取服务器返回数据
        InputStream in = conn.getInputStream();

        byte[] buf =newbyte[1024 * 1024];

        int len = in.read(buf);
        // 将数据显示在文本区中
        ta.append(new String(buf, 0,len));
      } catch (Exception e) {
        e.printStackTrace();
      }
   }
   publicstaticvoid main(String[] args) {
      // 运行窗体
      new MyIEGUI();
   }
}

总结:域名解析器

我们在地址览输出一个地址的时候,如www.sina.com.cnwww.baidu.com首先我们的计算机先在自己的机器目录:C:\Windows\System32\drivers\etc\hosts文件里面查找这一个域名所映射的IP地址,找到的话直接用本地的,例如:我们本机的回环地址127.0.0.1,如果找不到的话直接报出连接不上网络;这一点我们可以使用它来屏蔽一个广告网站或是垃圾网站信息的显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值