1. 程式人生 > >Java---網路程式設計(4)-C/S-B/S

Java---網路程式設計(4)-C/S-B/S

C/S 與 B/S

☆ C/S ( Client/Server ) 客戶端和服務端的特點

1、客戶端和服務端的軟體都需要程式設計師進行編寫。
2、客戶端維護起來較為麻煩。(缺陷)
3、客戶端的存在可以將一部分運算分離到客戶端來執行,減輕了伺服器端的壓力。(優勢)

☆ B/S ( Browse/Server ) 瀏覽器和服務端的特點

1、客戶端不用程式設計師編寫,直接使用系統中具備的瀏覽器軟體作為客戶端即可。程式設計師只需要編寫伺服器端就OK了。
2、維護起來也很容易,因為只要維護伺服器即可。(優勢)
3、所有的運算都在伺服器端,相對壓力較大。(缺陷)

程式設計練習1

1、自定義一個伺服器,接收瀏覽器發來的資訊。顯示瀏覽器傳送了什麼資訊,並向瀏覽器傳送簡單的網頁資訊。

只實現了單執行緒~~~多執行緒我寫了~只是由於不知道的原因~會出現Socket異常關閉的情況~!所以並沒有實現~

單執行緒:成功~

package cn.hncu.bs;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author
陳浩翔 * * @version 1.0 2016-5-11 */
public class MyServer { public static void main(String[] args) { try { while (true) { ServerSocket server = new ServerSocket(80); Socket s = server.accept(); System.out.println(s.getInetAddress().getHostAddress() + "...來訪"
); InputStream in = s.getInputStream(); byte buf[] = new byte[1024]; int len = in.read(buf); String text = new String(buf, 0, len); System.out.println(text); BufferedReader bin = new BufferedReader(new FileReader( "chx.html")); // 要加true重新整理PrintWriter流 PrintWriter pw = new PrintWriter(s.getOutputStream(), true); String line = null; while ((line = bin.readLine()) != null) { pw.println(line); } in.close(); pw.close(); s.close(); server.close(); } } catch (IOException e) { e.printStackTrace(); } } }

多執行緒:失敗了的例子:
求解:

package cn.hncu.bs;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author 陳浩翔
 *
 * 2016-5-10
 */
public class MyServer {

    public static void main(String[] args) {
        try {
            while(true){
                ServerSocket server = new ServerSocket(80);
                //多客戶同時訪問
                Socket s = server.accept();
                new Thread(new ServerThread(s)).start();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ServerThread implements Runnable{
    Socket s = null;
    public ServerThread(Socket s) {
        this.s = s;
    }
    @Override
    public void run() {
        try {
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+"...來訪問了~");
            InputStream in = s.getInputStream();
            byte buf[] = new byte[1024];
            int len = in.read(buf);
            String text = new String(buf,0,len);
            System.out.println(text);

            BufferedReader bin = new BufferedReader(new FileReader("chx.html"));

            //要加true重新整理PrintWriter流
            PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
            String line=null;

            while((line=bin.readLine())!=null){
                System.out.println(line);
                pw.println(line);
            }
            in.close();
            pw.close();
            s.close();

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

我老師給的解釋是:

在練習MyServer時採用多執行緒都出現了多次請求與應該的情況,這很可能是TCP的三次握手造成的,即客戶瀏覽器跟伺服器進行幾次請求與應答通訊,而伺服器在第二次(同一次請求中的第2次握手)收到資訊時卻用另一個執行緒去接,因此握手就實現不了,而伺服器卻多次輸出收到訊息

程式設計練習2

2、模擬一個瀏覽器客戶端向伺服器發請求,接收並顯示響應訊息。

package cn.hncu.bs;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author 陳浩翔
 *
 * @version 1.0  2016-5-11
 */
public class MyBrowse {

    public static void main(String[] args) {
        String ipAdd = "www.hncu.net";
        try {
            Socket s = new Socket(ipAdd, 80);
            //向伺服器傳送http協議請求頭,以讓伺服器認識我們,給我們正確地響應
            OutputStream out = s.getOutputStream();
            System.out.println(s.getPort());//埠
            PrintWriter pw = new PrintWriter(out,true);

            pw.println("GET / HTTP/1.1");//請求行包含: 請求方式(GET POST) 空格 請求的資源路徑 空格 http的協議版本
            pw.println("Accept: */*;");
            pw.println("Host: "+ipAdd);//下面這些key-value是請求頭
            //out.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
            //out.println("Accept-Encoding: gzip, deflate");
            pw.println("Connection: close");//如果沒有這一句,程式不會自己結束的
            pw.println();//空行---http協議請求頭結束之後,必須要一個空行
            System.out.println("請求完畢!");

            //接收伺服器的響應
            InputStream in = s.getInputStream();
            int len=0;
            byte b[] = new byte[1024];
            while((len=in.read(b))!=-1){
                String str = new String(b,0,len,"UTF-8");
                System.out.println(str);
            }
            s.close();

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

響應過來的訊息就是:

HTTP/1.1 200 OK
Date: Wed, 11 May 2016 10:56:05 GMT
Server: VWebServer
X-Frame-Options: SAMEORIGIN
Last-Modified: Wed, 11 May 2016 06:04:55 GMT
ETag: "6060-5328ad214afc0"
Accept-Ranges: bytes
Content-Length: 24672
Vary: User-Agent,Accept-Encoding
Cache-Control: private, max-age=600
Expires: Wed, 11 May 2016 11:06:05 GMT
Connection: close
Content-Type: text/html
Content-Language: zh-CN

//後面的就是網站的html程式碼了~~~
?<!DOCTYPE html><html><head><title>湖南城市學院</title>
...
...
...
...

</body></html>

程式設計練習3:

3、網路蜘蛛,收集網頁中的郵箱地址資訊。

package cn.hncu.bs;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;

/**
 * @author 陳浩翔
 * 
 * @version 1.0 2016-5-11
 */
public class SpiderDemo {

    //讀取網頁的郵箱
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.sina.com.cn/");
            System.out.println(url.getHost());
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
            String regex = "\\w+@\\w+(\\.\\w+)+";

            Pattern p = Pattern.compile(regex);

            String line = null;

            while((line=br.readLine())!=null){

                Matcher m = p.matcher(line);
                while(m.find()){
                    System.out.println(m.group());
                }
            }

            System.out.println("讀取完!");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 先測試本地的郵箱地址看能不能讀取出來---成功
     */
    @Test
    public void Test() {
        try {
            BufferedReader br = new BufferedReader(new FileReader("mail.html"));

            // 正則表示式
            String regex= "\\w+@\\w+(\\.\\w+)+";

            Pattern p = Pattern.compile(regex);
            String line=null;
            while((line=br.readLine())!=null){
                Matcher m = p.matcher(line);
                while(m.find()){
                    System.out.println(m.group());
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}