樂字節的小夥伴們,很久不見,甚是想念啊!java
前面我發佈的文章算是把Java初級基礎階段講完了,接下來小樂將會給你們接着講Java中級階段——Javaweb。web
首先,咱們要看看Javaweb階段主要重點掌握的知識:編程
瞭解C/S和B/S兩種結構模式
理解Web應用程序的工做原理
實現第一個Servlet程序
理解程序的內部工做流程
掌握web.xml的基本配置
這篇文章咱們先學習web發展基礎。緩存
回顧 Socket 編程給咱們最大的感覺,是能夠在多臺電腦之間進行數據的傳輸,這就是網絡編程的開端和基礎,經過客戶端請求服務器端通訊,直觀瞭解 Web 編程。服務器
Server
`/**網絡
*/
public class Server {併發
public static void main(String[] args) throws IOException { //一、建立服務器,指定端口ServerSocket(int port) ServerSocket socket=new ServerSocket(8888); //二、接收客戶端鏈接 Socket client=socket.accept(); System.out.println("******************"); //獲取數據的輸入流 InputStream is=client.getInputStream(); //使用字符緩存流 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String msg=""; while((msg=br.readLine())!=null){ System.out.println(msg); } br.close(); }
}
樂字節原創`框架
Client
`/**socket
*/
public class Client {ide
public static void main(String[] args) throws UnknownHostException, IOException { //建立客戶端 必須指定服務器+端口 Socket client=new Socket("localhost",8888); //發送消息 請求資源 //獲取發送流 OutputStream os=client.getOutputStream(); BufferedWriter br=new BufferedWriter(new OutputStreamWriter(os)); //寫出消息,發送內容 String msg="hello I need some source"; br.write(msg); br.close(); }
}`
從上面的例子總結通訊條件以下:
1)、須要有服務器端(server) :等待被請求,須要暴露ip 和 port
2)、須要有客戶端(client):主動發起請求 ,知曉服務端的ip 和 port
3)、通訊規則(協議):TCP/IP協議
ip用於定位計算機;端口號(定位程序),用於標識進程的邏輯地址,不一樣進程的標誌;有效端口:0~65535,其中0~1024由系統使用或者保留端口,開發中建議使用1024以上的端口。
Client
`package com.shsxt.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
/**
*
*/
public class Client {
public static void main(String[] args) throws IOException { // 經過系統默認類型的 SocketImpl 建立未鏈接套接字 Socket socket = new Socket(); //此類實現 IP 套接字地址(IP 地址 + 端口號)。它還能夠是一個對(主機名 + 端口號),在此狀況下,將嘗試解析主機名 SocketAddress address = new InetSocketAddress("localhost",8898); // 將此套接字鏈接到服務器,並指定一個超時值。 或者不指定超時時間 socket.connect(address, 1000); OutputStream os = socket.getOutputStream(); os.write("time".getBytes()); os.flush(); socket.close(); }
}`
Server
`package com.shsxt.socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
*/
public class Server {
public static void main(String[] args) throws IOException { //建立綁定到特定端口的服務器套接字。 ServerSocket server = new ServerSocket(8898); // Socket accept() 偵聽並接受到此套接字的鏈接。 Socket client = server.accept(); System.out.println("接收到鏈接"); InputStream is = client.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); byte[] req = new byte[1024]; // 接收客戶端請求 int len = bis.read(req); String reqStr = new String(req,0,len); System.out.println(reqStr); if(reqStr.equals("money")){ System.out.println("here's the money"); }else if(reqStr.equals("time")){ System.out.println("you have so much time"); } client.close(); server.close(); }
}`
Client
``package com.shsxt.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
/**
*/
public class Client {
public static void main(String[] args) throws IOException { // 經過系統默認類型的 SocketImpl 建立未鏈接套接字 Socket socket = new Socket(); //此類實現 IP 套接字地址(IP 地址 + 端口號)。它還能夠是一個對(主機名 + 端口號),在此狀況下,將嘗試解析主機名 SocketAddress address = new InetSocketAddress("localhost",8898); // 將此套接字鏈接到服務器,並指定一個超時值。 或者不指定超時時間 socket.connect(address, 1000); OutputStream os = socket.getOutputStream(); os.write("money".getBytes()); os.flush(); // 接收響應, 顯示結果 InputStream is = socket.getInputStream(); byte[] result = new byte[1024]; int len = is.read(result); String resultStr = new String(result,0,len); System.out.println(resultStr); socket.close(); }
}`
Server
package com.shsxt.socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
*/
public class Server {
public static void main(String[] args) throws IOException { // 建立綁定到特定端口的服務器套接字。 ServerSocket server = new ServerSocket(8898); // Socket accept() 偵聽並接受到此套接字的鏈接。 Socket client = server.accept(); System.out.println("接收到鏈接"); InputStream is = client.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); byte[] req = new byte[1024]; // 接收客戶端請求 int len = bis.read(req); String reqStr = new String(req, 0, len); System.out.println(reqStr); // 將接收到的請求封裝成對象, 傳送給請求的類 MyRequest request = new MyRequest(); MyResponse response = new MyResponse(); OutputStream os = client.getOutputStream(); if (reqStr.equals("money")) { // 根據請求的信息, 構造處理的類 MyServlet s1 = new ServletMoney(); s1.service(request, response); // 經過client的響應, 將結果響應回客戶端 os.write("here's the money".getBytes()); os.flush(); } else if (reqStr.equals("time")) { // 根據請求的信息, 構造處理的類 MyServlet s2 = new ServletTime(); s2.service(request, response); // 經過client的響應, 將結果響應回客戶端 os.write("you have somuch time".getBytes()); os.flush(); } client.close(); server.close(); }
}
/*
*/
interface MyServlet {
void service(MyRequest req, MyResponse resp);
}
class ServletMoney implements MyServlet {
/* * @see com.shsxt.socket.MyServlet#service(com.shsxt.socket.MyRequest) */ @Override public void service(MyRequest req, MyResponse resp) { // 作出力所能及的處理 }
}
class ServletTime implements MyServlet {
/* * @see com.shsxt.socket.MyServlet#service(com.shsxt.socket.MyRequest) */ @Override public void service(MyRequest req, MyResponse resp) { // 作出力所能及的處理 }
}
/*
*/
class MyRequest {
}
class MyResponse {
}`
隨着客戶需求愈來愈複雜,須要的功能愈來愈多,咱們的服務器端須要處理的請求愈來愈多,須要區分不一樣的請求,還須要按照不一樣請求進行請求數據的提取以及資源的分配和運算還有邏輯的處理,最後還須要響應給客戶端,這就使得服務器端代碼愈來愈複雜,實現愈來愈困難。
根據以往的經驗,雙方進行通訊只須要遵循必定的規則就能夠很明確地知道各部分數據的含義,因而出現了網絡更上層的應用協議(後面講的 HTTP 協議),規定服務器端和客戶端通訊的規則。
客戶端請求服務器端和服務器端響應客戶端,都按照固定的規則,那麼接收請求和相應數據這部分操做就能夠固定下來,交給特定的一段代碼來執行,從而減小服務器端的代碼量,因而出現了接下來講的服務器。
當客戶端請求的資源愈來愈豐富,需求愈來愈複雜,程序的核心就應該放在解決業務和 計算響應數據上,因而出現了服務器統一接收客戶端處理並進行分發到不一樣的資源,由各個資源進行處理,最後結果交由服務器響應。
從上面的描述能夠發現,如今所說的服務器只是負責接收請求,對請求進行分發,以及最後將獲取的數據進行相應的固定框架,至於數據怎麼計算得出還得根據具體的業務需求編 寫(填充)代碼。在沒有業務需求的狀況下就能將服務器準備出來,如今市面上的服務器有 不少,比較經常使用的有:Tomcat、JBOOS、IBM 的 WebSphere、BEA 的 WebLogic 以及 Apache 等。
好了,web發展基礎就講到這裏了,下一文章將會給你們Javaweb的介紹和C/S、B/S體系結構,敬請關注樂字節哦~~~~