網絡編程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:[email protected]

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,如果找不到的話直接報出連接不上網絡;這一點我們可以使用它來屏蔽一個廣告網站或是垃圾網站信息的顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章