C/S架構: 即Client/Server(客戶端/服務器端)架構,QQ、迅雷。java
B/S架構: 即Browser/Server(瀏覽器端/服務器端)架構,簡化了系統的開發,維護和使用。谷歌、火狐。數據庫
B/S架構與C/S架構的區別:編程
C/S架構基於局域網的,而B/S架構基於廣域網的基礎上。瀏覽器
硬件環境不一樣,C/S創建在專用網絡上,小範圍的網絡,能夠專門的服務器提供數據鏈接和數據交換安全
C/S通常面向的固定用戶羣體,對信息的安全控制較高較高一點。服務器
對程序架構不一樣網絡
用戶接口不一樣:C/S架構大多創建在Windows平臺上,B/S創建在瀏覽器上,不只能夠應用在Windows平臺上,也能夠應用在Unix/Linux等平臺上。多線程
兩種架構各有優劣,可是不管使用哪一種架構,都離不開網絡的支持。網絡編程,就是在必定的協議下,實現兩臺計算機通訊的程序。架構
網絡通訊協議:通訊協議是計算機通訊必須聽從的一種規則,協議中對數據的傳輸格式、傳輸的速率、傳輸的步驟等都作了統一的規定,通訊雙方必須同時遵照,最終實現數據的正常傳輸和交換。dom
TCP/IP:傳輸控制協議(TCP)/因特網互聯協議(IP),他們倆定義了計算機如何聯網、數據如何交換和傳輸的標準。它的內部包含了一系列用於處理數據通訊的協議,並採用了4層的分層模型,每一層都呼叫下一層所提供的協議來完成本身的請求。
TCP協議:傳輸控制協議,該協議是面向鏈接的通訊協議,即數據傳輸前,在發送端和接收端先創建邏輯鏈接,而後再傳輸數據,它提供了兩臺計算機之間可靠的無差錯的數據傳輸。
三次握手:在數據發送的準備階段,客戶端和服務器之間經過三次交互,保證鏈接的可靠性。
三次握手:
經過三次握手,創建鏈接後,客戶端和服務器端就能夠進行數據傳輸了。因爲這種面相鏈接的特性,TCP協議可以數據傳輸的安全。因此應用挺普遍的,下載文件等。
協議:計算機通訊必須遵照的規則。
IP地址:互聯網協議地址,俗稱IP,IP地址用來給網絡中的計算機編訂一個惟一的編號。
端口號:端口號就是惟一標識設備中的進程(應用程序)。IP地址是惟一標識網絡中的設備。
IP地址分類:
IPv4:是一個32位的二進制數,一般被分爲4個字節,表示形式:a.b.c.d ,例如:192.168.53.245 ,其中a.b.c.d都是一個0~255之間的十進制的整數,那麼最多可以表示42億個。
IPv6:爲了擴大地址空間,經過IPv6從新定義地址空間,採用128位地址長度,每16個字節分爲一組,分紅8組十六進制數 ,表示形式:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,號稱互聯網中的任何一粒沙子可以編寫進去,解決了地址不夠的問題。
經過DOS命名查看本機的IP地址:ipconfig
檢查網絡鏈接是否正常:ping ip地址
特殊的IP地址:
本機的IP地址:127.0.0.1 localhost 經過hosts文件,能夠自定義本身的域名
端口號:如何區分在網絡通訊中打開的這些進程(應用程序)?經過端口號能夠準確的找到彼此。
端口號:用兩個字節表示的整數,它的取值範圍是0~65535。 其中,0~1023之間的的端口號被一些知名的應用和網絡服務佔用了。普通的常規的應用程序只能使用從1024以上的端口號, 若是端口號被另一個服務或者應用程序佔用了,會致使當前程序啓動失敗。
經常使用的端口號:
Tomcat應用服務器:8080
HTTP服務器:80 www.baidu.com:80 80端口能夠選擇省略不寫
數據庫服務器:MYSQL:3306 Oracle:1521
目的:實現兩臺計算機之間的交互,通訊兩端要嚴格區分客戶端和服務器端口
服務端須要啓動,等待客戶端連接
客戶端須要主動地連接服務器端,連接成功才能通訊,服務器端口不能夠主動連接客戶端
在java中,提供兩個類,實現TCP通訊:
客戶端:建立Socket對象,建立以後就至關於建立了客戶端,向服務器端發送連接請求,服務器端迴響一個請求表示已經接受,二者就創建了通訊
服務器端:建立ServerSocket對象,建立以後就至關於,開啓了一個服務,等待客戶端連接
Socket類,實現客戶端套接字,套接字指的是兩臺設備之間通信的端點,
public Socket(String host,int port);--->建立套接字對象並鏈接到指定主機的指定端口號,若是指定了host是一個null,那麼就至關於與指定地址爲回送地址【127.x.x.x】,是本機的回送地址,主要用於網絡軟件測試使用,本機上進程間的通訊。就不會進行網絡傳輸
public InputStream getInputStream();---->獲取套接字的輸入流
public OutputStream getOutputStream();--->獲取套接字輸出流
public void close();--->關閉套接字
public void shoutdownOutput();--->禁用套接字輸出流
任何先前寫入的數據都將會被髮送,最後終止輸出流
ServerSocket類實現了服務器端套接字,該對象等待經過網絡的請求
ServerSocket(int port);--->使用該構造方法子建立ServerSocket建立對象時,就能夠將其綁定到一個指定的端口號上面,參數port就是端口號
public Socket accept();--->監聽並接受鏈接,返回一個新的Socket對象,用於和用戶端實現通訊。
步驟:
在客戶端當中,經過輸入流,從硬盤當中讀取文件數據到內存
在客戶端當中,經過輸出流,寫入文件數據到服務器端
在服務器端中,經過輸入流,讀取文件數據到服務器端中
在服務器端中,經過輸出流,寫入文件數據到服務器硬盤當中
服務端,保存文件的名稱若是名稱固定,那麼最終會致使服務器硬盤,只會保留一個文件,對上傳的文件名稱優化,
//文件名稱定義規則: "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";
服務器端,接收一個文件以後就關閉了,後面的其餘客戶端沒法繼續上傳文件,使用循環進行改進,能夠不斷的接收不一樣的客戶端傳輸過來的文件。
// 使用循環 while(true) { Socket socket = serverSocket.accept(); .... .... }
服務器端,在接收文件的時候,加入某個客戶端給你傳輸一個大文件,此時就不能再接收其餘用戶的文件,因此能夠用多線程技術優化接收效率。
while(true) { Socket socket = serverSocket.accept(); // 使用多線程技術,提升程序的效率 // 有一個客戶端上傳文件,就開啓一個線程,完成文件的上傳 new Thread(new Runnable() { // 重寫run方法,設定線程的任務 @Override public void run() { // 使用網絡字節輸入流對象 InputStream is = socket.getInputStream(); // 指定一個目錄 File file = new File("D:\\upload"); if(!file.exits()) { file.mkdirs(); } // 防止同名的文件被覆蓋 String filename = "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg"; // 構建一個本地的文件字節輸出流對象 new FileOutputStream(file + "\\" + filename); // 一讀一寫完成文件的上傳,最終把文件寫入到服務器端的硬盤當中。 ..... } }).start(); } // 服務端不關閉 // serverSocket.close();