国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

高層協議POP3與HTTP
2007-09-24   網絡

本節是《Java與Internet編程》的第三部分,也是最后一部分。在前面兩節中,我們介紹了網絡編程的基礎知識,如協議、端口、套接字、UDP等,并給出了一些客戶程序和服務程序的實現實例。本節我們介紹兩個更高級的協議:POP3和HTTP,并給出一個POP3客戶程序和一個HTTP服務器的實現。

   ㈠ POP3協議簡介

   POP3是一種高級網絡協議,它的全稱是Post Office Protocol Version 3。使用該協議,客戶程序能夠動態地、有效地訪問服務器上的郵件。簡單地說,POP3是一種能夠讓客戶程序提取駐留于服務器的郵件的協議。有關POP3的操作可以概括為:

服務器在端口110監聽客戶請求。
客戶程序發出連接請求并通過身份驗證。
客戶程序發送命令;服務器處理命令并將結果發送給客戶程序;重復這個過程直至客戶程序結束或中止連接為止。
   POP3命令都是單行的,它由一個關鍵字開頭,后面加上一個或多個參數,最后為一個回車符加一個換行符(CRLF)。服務器的應答可以由一行或多行組成,開頭內容總是命令處理結果(+OK或-ERR),緊接著是其他附加信息,最后是一個CRLF。對于多行應答,最后一行是英文句點(“.")加一個CRLF。

   下表是部分POP3命令的說明:

 

命令 說 明
STAT 獲得郵箱的狀態信息,即郵件數量及大小。
RETR msg 下載指定的郵件。
DELE msg 將指定的郵件標記為刪除。
NOOP 空操作。
RSET 取消所有的刪除標記。
QUIT 結束會話。
TOP msg n 下載指定郵件的頭信息及前面的n行。
UIDL [msg] 獲得所有郵件或指定郵件的唯一標識符。
USER name 標示將要訪問的郵箱(即用戶名字)。
PASS pw 發送由USER命令指定的用戶的密碼(以明文發送)。

   ㈡ POP3客戶程序實例

   下面的MailStat.java程序演示了POP3協議的基本用法。該程序的功能是檢查指定服務器上的郵件狀態。

 【MailStat.java】

 public class MailStat{

  private static final int POP3_PORT = 110;

  public static void main(String[] args) {

  String host;

  InetAddress hostAddress;

  String username;

  String password;

  Socket mailSocket;

  BufferedReader socketInput;

  DataOutputStream socketOutput;

  // 檢查參數

  if (args.length < 3) {

  System.out.println("用法: MailStat [服務器] [用戶名字] [密碼]");

  }

  else {

  host = args[0];

  username = args[1];

  password = args[2];


  try {

  hostAddress = InetAddress.getByName(host);

  System.out.println("正在連接服務器" + hostAddress + "...");

  mailSocket = new Socket(host, POP3_PORT);

  try {

  socketInput = new BufferedReader(

  new InputStreamReader(mailSocket.getInputStream()) );

  socketOutput = new DataOutputStream(mailSocket.getOutputStream());

  // 從服務器讀入初始應答

  readReply(socketInput);

  // 驗證身份

  sendCommand(socketOutput, "USER " + username);

  readReply(socketInput);

  sendCommand(socketOutput, "PASS " + password);

  readReply(socketInput);

  // 獲得狀態信息

  sendCommand(socketOutput, "STAT");

  readReply(socketInput);

  // 結束會話

  sendCommand(socketOutput, "QUIT");

  readReply(socketInput);

  } finally {


  mailSocket.close();

  }

  }

  catch(Exception theException) {

  System.out.println(theException);

  }

  }

  System.exit(0);

  }

 

  /**

  * sendCommand() 發送一個POP3命令

  */

  private static void sendCommand(DataOutputStream out, String command)

  throws IOException {

  …略…

  }

  /**

  * readReply() 讀取并顯示POP3服務器的應答

  */

  private static String readReply(BufferedReader reader)

  throws IOException, Exception {

  …略…

  }

 }

   下面是其算法說明:

獲得命令行參數,包括郵件主機、用戶名稱、密碼。如果沒有指定這些參數,則輸出提示信息并退出。
獲得郵件服務器的IP地址。
打開與郵件服務器通訊的Socket。
引用Socket的輸入、輸出流。
讀取服務器的初始應答信息。
發送用戶名字并讀取應答。
發送密碼并讀取應答。
讀取狀態信息(郵件總數,郵箱大小)。
結束會話。
關閉Socket并退出。
   為簡單計,我們沒有為MailStat加上任何“特色”功能。您可以自己修改它使之更為實用,比如增加每隔幾分鐘檢查一次的功能,或同時檢查多個郵箱的功能,或一個圖形用戶界面,等等。

   ㈢ HTTP協議簡介

   HTTP協議也是一種高級網絡協議,是瀏覽器與Web服務器通信的標準協議。HTTP 1.1規范可以在RFC 2616找到,HTTP 1.0 規范可以在RFC 1945找到。

   有關HTTP的基本操作為:

服務器在端口80監聽。
客戶程序(如瀏覽器)連接到服務器并發送請求信息。
服務器發送應答信息。
由客戶程序或服務器關閉連接。
   客戶請求的一般格式為:

  < command> /< url> < HTTP-version>CRLF

  [< keyword>: < value>CRLF]

  ...

  [< keyword>: < value>CRLF]

   其中:

 < command> = 請求服務器處理的命令,如

  GET —— 提取文件

  HEAD —— 提取文件頭

  POST —— 發送表單數據

  PUT —— 上載文件

 < url> = 要求提取文件的URL

 < HTTP-version> = 客戶程序能夠理解的HTTP版本,如

  HTTP/1.0、HTTP/1.1等等

 < keyword> = 提供給服務器的附加信息關鍵詞。

  常見的關鍵詞如:

  Accept —— 可以接受的數據類型

  User-Agent —— 用來標識瀏覽器

   下面是客戶請求的幾個示例:

 ●GET /foo.html HTTP/1.1

 ●GET /foo.html HTTP/1.1

  Accept: text/html

  Accept: text/plain

  Accept: image/gif

  Accept: image/jpg

  User-Agent: Netscape/4.5

   服務器應答的基本格式如下:

 < HTTP-version> < response-code>CRLF

  Server: < server-identity>CRLF

  MIME-version: < MIME-version>CRLF

  Content-type: < content-type>CRLF

  Content-length: 11160

  CRLF

  < data>

   其中:


 < HTTP-version> = 服務器所使用的HTTP版本號。
 < response-code> = 應答類型。它由兩部分組成,即一個編號及文本說明。最常見的應答是“200 OK”和“404 Not Found”。編號為200-299的應答表示成功,300-399表示重定向,400-499表示客戶錯誤,500-599表示服務器錯誤。
 < server-identity> = 服務器標識。
 < MIME-version> = 服務器所使用的MIME版本號。
 < content-type> = 所發送內容的MIME類型:text/html,image/gif等。
 < content-length> = 以字節計的發送內容長度。
 < data> = 內容。
   下面是服務器應答的一個實例:

  HTTP/1.1 200 OK

  Server: NCSA/1.4.2

  MIME-version: 1.0

  Content-type: text/html

  Content-length: 37756

  < html>


  < head>< title>Foo< /title>< /head>

  < body>Foo< /body>

  < /html>

   ㈣ 一個多線程HTTP服務器的實現

   下面的HttpServer.java給出了一個簡單的Web服務器。它僅由兩個類構成,只支持HTML、TEXT、GIF和JPEG文件的GET命令。

 【HttpServer.java】

 public class HttpServer {

  private static int DEFAULT_PORT = 80;

  private int serverPort;

  public static void main(String[] args) {

  int port = DEFAULT_PORT;

  // 獲取命令行參數

  if (args.length >= 1) {

  try {

  port = Integer.parseInt(args[0]);

  } catch(NumberFormatException ex) {

  System.out.println("Usage: HttpServer [端口]");

  System.exit(0);

  }

  }

  (new HttpServer(port)).go();

  }

  public HttpServer() {

  this(DEFAULT_PORT);

  }

  public HttpServer(int port) {

  super();

  this.serverPort = port;

  }

  /**

  * 啟動服務器

  */

  public void go() {

  ServerSocket httpSocket;

  Socket clientSocket;

  HttpRequestThread requestThread;

  try {

  httpSocket = new ServerSocket(serverPort);

  System.out.println("HttpServer在端口" + serverPort + "監聽.");

  try {

  while (true) {

  clientSocket = httpSocket.accept();

  requestThread = new HttpRequestThread(clientSocket);

  requestThread.start();

  }

  } finally {

  httpSocket.close();

  }

  } catch(Exception ex) {

  System.out.println(ex.toString());


  }

  System.exit(0);

  }

 }

   下面是它的算法說明:

從命令行獲取端口參數。若沒有指定,則默認為80。
在指定的端口打開一個服務器Socket。
開始循環:
等待客戶程序的連接請求,當請求到達時獲得客戶Socket的引用。
創建一個新的請求服務線程,并以客戶Socket為參數啟動該線程。
結束循環。
關閉服務器Socket并退出。
   客戶請求的服務線程類實現如下:

 【HttpRequestThread.java】

 public class HttpRequestThread extends Thread {

  private Socket clientSocket;

  public HttpRequestThread(Socket clientSocket) {

  super();

  this.clientSocket = clientSocket;

  }

  /**

  * 啟動服務線程

  */


  public void run() {

  OutputStream out;

  BufferedReader in;

  String line;

  StringTokenizer tokenizer;

  String method;

  String url;

  String httpVersion;


  try {

  try {

  // 引用輸入、輸出流

  out = clientSocket.getOutputStream();

  in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

  // 從客戶請求讀入一行

  line = in.readLine();

  tokenizer = new StringTokenizer(line);

  if (tokenizer.countTokens() == 3) {

  // 獲得命令類型、URL、HTTP版本號

  …略…

  if (method.equalsIgnoreCase("get")) {

  sendResponse(out, url);

  }

  }

  } finally {

  clientSocket.close();

  }

  } catch (Exception ex) {

  System.out.println("RequestThread: " + ex.toString());

  }

  }

  /**

  * 將服務器應答發送給瀏覽器

  */

  public void sendResponse(OutputStream out, String url) throws IOException {

  …略…

  }

 }

   服務線程的算法說明如下:

引用Socket的輸入、輸出流。
打印客戶請求內容。
如果客戶請求命令為GET,則發送應答:若所請求的文件存在,則將該文件作為應答的內容發送;否則,發送“404 Not Found”。
   編譯這兩個Java類,執行“java HttpServer”之后,就可以用瀏覽器打開class文件所在目錄下的頁面文件了。

熱詞搜索:

上一篇:windows2003權限如何配置
下一篇:Web開發中遠程腳本的應用

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
a美女胸又www黄视频久久| 水野朝阳av一区二区三区| 国产91在线观看| 国产午夜亚洲精品羞羞网站| 粉嫩av一区二区三区粉嫩| 欧美国产日韩精品免费观看| 国产999精品久久久久久| 亚洲欧美日韩久久| 欧美写真视频网站| 久久99精品一区二区三区| 久久久国产综合精品女国产盗摄| 国产成人在线观看免费网站| 国产精品白丝在线| 欧美日韩激情一区二区| 乱中年女人伦av一区二区| 久久精子c满五个校花| 成人一二三区视频| 亚洲一线二线三线视频| 欧美一区二区日韩| va亚洲va日韩不卡在线观看| 午夜激情久久久| 久久众筹精品私拍模特| 99久久亚洲一区二区三区青草| 亚洲精品国产第一综合99久久| 欧美军同video69gay| 国产东北露脸精品视频| 亚洲免费观看高清完整| 日韩一区二区免费视频| 成人午夜精品在线| 日韩精品一区第一页| 亚洲国产精华液网站w| 欧美欧美午夜aⅴ在线观看| 国产精品主播直播| 亚洲一区二区视频在线观看| 亚洲精品一区二区在线观看| 欧美性欧美巨大黑白大战| 国产精品白丝jk白祙喷水网站 | 狂野欧美性猛交blacked| 国产女主播视频一区二区| 欧美日韩一本到| 成人午夜私人影院| 久久99精品久久久久久久久久久久 | 毛片不卡一区二区| 国产精品每日更新| 日韩精品资源二区在线| 欧美又粗又大又爽| kk眼镜猥琐国模调教系列一区二区| 麻豆一区二区三| 亚洲一区二区三区中文字幕| 中文字幕精品在线不卡| 欧美一区二区三区精品| 在线观看成人免费视频| av一区二区三区四区| 国产一区二区日韩精品| 视频一区在线播放| 亚洲一区二区三区四区在线观看 | 最新国产精品久久精品| 久久综合99re88久久爱| 日韩欧美国产麻豆| 欧美精品久久久久久久久老牛影院| 91丝袜美女网| 成人黄色片在线观看| 国产精品一二三在| 国产精选一区二区三区| 精品一区二区在线视频| 久久99国产精品尤物| 青青草97国产精品免费观看无弹窗版| 亚洲国产裸拍裸体视频在线观看乱了 | 国内成人精品2018免费看| 免费欧美日韩国产三级电影| 日韩电影免费在线观看网站| 亚洲线精品一区二区三区八戒| 亚洲免费av观看| 亚洲精品ww久久久久久p站| 成人欧美一区二区三区在线播放| 中文字幕av一区二区三区| 国产精品女主播在线观看| 中文字幕成人在线观看| 中文字幕久久午夜不卡| 国产精品二三区| 国产精品白丝在线| 一区二区三区在线观看欧美| 亚洲一区二区三区不卡国产欧美| 亚洲综合另类小说| 亚洲成人午夜影院| 人人狠狠综合久久亚洲| 久久激情五月激情| 国产一级精品在线| www.欧美日韩国产在线| 色综合久久久久久久| 欧美日韩另类国产亚洲欧美一级| 欧美一级日韩一级| 精品国产91九色蝌蚪| 国产精品久久久久天堂| 亚洲美女精品一区| 日韩中文字幕一区二区三区| 麻豆91免费看| 成人黄色av网站在线| 色综合天天综合网国产成人综合天| 在线亚洲一区二区| 日韩欧美中文字幕制服| 国产欧美日韩视频一区二区| 亚洲欧洲综合另类在线| 五月天中文字幕一区二区| 精品一区二区三区免费毛片爱| 国产成人啪免费观看软件 | 日本韩国欧美一区二区三区| 欧美三级中文字幕在线观看| 日韩一二三四区| 中文字幕av一区二区三区高| 亚洲国产精品久久久久婷婷884 | 美国毛片一区二区| 日韩成人伦理电影在线观看| 激情另类小说区图片区视频区| 国产电影一区二区三区| 91视频免费看| 欧美mv日韩mv| 亚洲欧美成人一区二区三区| 日韩av网站在线观看| av中文字幕不卡| 日韩美女视频在线| 亚洲美女淫视频| 国产在线精品一区二区三区不卡 | 天堂精品中文字幕在线| 国产成人av电影在线观看| 欧美日韩一级黄| 中文字幕一区二区三区不卡在线 | 亚洲国产精品嫩草影院| 国产aⅴ综合色| 日韩一区二区精品在线观看| 亚洲婷婷综合久久一本伊一区| 九九视频精品免费| 欧洲亚洲国产日韩| 日韩一区日韩二区| 国产福利精品一区二区| 日韩欧美黄色影院| 亚洲va欧美va人人爽| 一本大道久久精品懂色aⅴ| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 91精品福利在线| 亚洲国产精品二十页| 精品一区二区三区在线播放 | 久久先锋资源网| 亚洲成人一二三| 日本高清无吗v一区| 国产精品伦理在线| 极品少妇xxxx偷拍精品少妇| 7777女厕盗摄久久久| 一区二区久久久| 91丨九色丨国产丨porny| 国产午夜精品久久久久久久 | 99久久精品国产导航| 久久久久99精品一区| 美女久久久精品| 欧美一级片免费看| 日韩精品1区2区3区| 欧美日韩另类一区| 亚洲va韩国va欧美va| 在线观看av一区二区| 亚洲综合清纯丝袜自拍| 欧美专区在线观看一区| 亚洲美腿欧美偷拍| 欧美中文字幕一二三区视频| 亚洲欧美影音先锋| 不卡一区二区在线| 中文字幕日韩av资源站| 风间由美一区二区三区在线观看| 国产亚洲自拍一区| 国产成人综合视频| 欧美国产日韩亚洲一区| 9色porny自拍视频一区二区| 中文字幕视频一区| 在线观看一区日韩| 天堂久久一区二区三区| 日韩精品一区二区三区蜜臀 | 色综合久久综合| 一区二区三区国产豹纹内裤在线| 色天使久久综合网天天| 亚洲综合区在线| 欧美一区日韩一区| 久久99精品久久久久久| 欧美国产乱子伦 | 欧美日韩一区精品| 免费观看91视频大全| 久久久久成人黄色影片| aaa国产一区| 午夜久久久久久久久| 欧美xxxx在线观看| 成人视屏免费看| 伊人开心综合网| 337p亚洲精品色噜噜| 激情都市一区二区| 国产精品欧美一区喷水| 色老综合老女人久久久| 日韩成人免费电影| 中文字幕免费在线观看视频一区| 欧美最猛性xxxxx直播| 日本va欧美va欧美va精品| 久久久电影一区二区三区| 91久久免费观看|