黑馬程序員-第二十四天(網絡編程)

---------------------- ASP.Net+Unity開發.Net培訓、期待與您交流! ----------------------

                             第二十三天(網絡編程)
一,網絡通訊要素
IP地址(網絡中設備的標識):
一共有四 段組成,每一段就是一個字節最大就是255(8個1)
本地迴環地址(如果沒有配置本機Ip地址):127.0.0.1  主機名:localhost
網絡段:192.168.1.0
網絡段中的廣播地址:192.168.1.255
端口:
數據要發送到對方指定的應用程序上,爲了標識這此應用程序,所以給這些網絡應用程序都用數字進行標識,爲了方便稱呼這個數字叫做:端口(邏輯端口)                             
範圍:0---65535,一般0---1024系統使用或保留端口

協議:定義通信規則,這個通訊規則稱爲協議 國際組織定義了通用協議:TCP/IP協議 UDP協議

二。網絡模型


1,OSI參考模型
應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層
2,TCP/IP參考模型
應用層(Http,Ftp),傳輸層(TCP UDP),網際層(IP),主機到網絡層

三,常用類和方法
1,InetAddress類(沒有構造函數)
方法:
static InetAddress getLocalHost():返回本機IP地址對象
static InetAddress getByName(String host):返回指定的主機對象 參數可是ip地址,也可以是主機名 拋異常UnknownHostException
static InetAddress getAllByName(String host):返回指定主機的數組  拋異常UnknownHostException
static InetAddress getByAddress(byte[] buf):根據ip地址返回此對應的主機對象 拋異常UnknownHostException
String getHostAddress();獲取主機的地址(ip)
String getHostName();獲取主機的名稱。當此ip地址沒有在網絡上註冊時返回的主機名還是ip地址

2,TCP和UDP
UDP:面向無鏈接  如:聊天,網絡視頻會議,桌面共享,步話機,對講機
·將數據及源和目的封裝成數據包中,不需要建立連接
·每個數據報的大小在限制在64k內(超出後分包)
·因無連接,是不可靠協議
·不需要建立連接,速度快

TCP:面向連接  如:下載,打電話
·建立連接,形成傳輸數據的通道
·在連接中進行大數據量傳輸
·通過三次握手完成連接,是可靠協議
·必須建立連接,效率會稍低。

四,UDP:

3,Socket(插座的意思)
·Socket就是爲網絡服務提供的一種機制
·通信的兩端都有Socket
·網絡通信其實就是Socket間通信
·數據在兩個Socket間通過IO傳輸

4,udp使用來DatagramSocket類來完成數據包(DatagramPacket)傳輸
DatagramSocket類此類表示用來發送和接收數據報包的套接字。 
構造方法:
常用方法:
public void send(DatagramPacket p)   throws IOException   發送數據包
public void receive(DatagramPacket p)  throws IOException  接收數據包
DatagramPacket類此類表示數據報包。
構造方法:(有接收和發送)
發送:
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
          構造數據報包,用來將長度爲 length 的包發送到指定主機上的指定端口號。
         接收:
          DatagramPacket(byte[] buf, int length)   構造 DatagramPacket,用來接收長度爲 length 的數據包。
         
    udp發送端思路:
    1,建立udpSocket服務
    2,提供數據,並將數據封裝到數據包中
    3,通過Socket服務的發送功能,將數據包發出去
    4,關閉資源
   
    代碼體現:
    1,創建udp服務,通過DatagramSocket對象
    DatagramSocket ds  = new DatagramSocket();
    2,確定數據,並封裝成數據包
    byte[] date = "udp is coming".getBytes();
    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000),會拋UnknownHostException
    3,通過Socket服務,將已有的數據包發送出去,通過send方法
    ds.send(dp);
    4,關閉資源
    ds.close();
   
    udp接收端的思路:
    1,定義udp Socket服務端
    2,定義一個數據包,因爲要存儲接收到的字節數據,因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息
    3,通過socket服務的receive方法將收到的數據存入已經定義好的數據包中
    4,通過數據包對象的特有功能,將這此不同的數據取出
    5,關閉資源
   
    代碼體現:
    1,創建udp scoket 建立端點,通常會監聽一個端口,其實就是給這個接收網絡應用程序定義數字標識,方便明確哪些數據過來該應用程序可以處理
    DatagramSocket ds  = new DatagramSocket();
    2,定義數據包,用於存儲數據
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf,buf.length);
    3,通過服務的receive方法將接收到的數據包存儲到數據包中
    ds.receive(dp);
    4,通過數據包的方法獲取其中的數據
    String ip = dp.getAddress().getHostAddress();
    String data = new String(da.getData(),0,dp.getLength());
    int port = dp.getPort();
    5,關閉資源
    ds.close();
   
    receive()方法是一個阻塞式方法。。端口使用後不會立刻釋放的
   
五,TCP
1,tcp 傳輸分客戶端和服務端,客戶端對應的對象是Socket,服務端對應對象是ServerSocket
2,客戶端:
通過查閱Socket對象,發現在該對象建立時,就可以去連接指定主機,因爲tcp是面向連接的,並連接成功,形成通路後,在該通路下進行數據的傳輸

3,步驟:
1,創建Socket服務,並指定要連接的主機和端口
Socket s  = new Socket(InetAddress,port);
也可以建立一個空參數的socket服務,,然後調用connect(SocketAddress endpoint) 將此套接字連接到服務器。
其中SocketAddress是的一個抽象類可以使用其子類InetSocketAddress此類實現 IP 套接字地址(IP 地址 + 端口號)。
它還可以是一個對(主機名 + 端口號),在此情況下,將嘗試解析主機名。
2,爲了發送數據 ,應該獲取socket流中的輸出 流
OutputStream out = s.getOutputStream();
out.write(byte[]);
3,關閉資源
s.close();

2,服務端
1.建立服務端socket服務,ServerSocket()並監聽一個端口
ServerSocket ss = new ServerSocket(1000)
ServerSocket(int port, int backlog) 監聽一個端口並指定最大連接數
2,獲取連接過來的客戶端對象通過ServerSocket的accept方法,沒有連接就會等,所以個方法是阻塞式的,
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();//獲取ip地址

3,客戶端如果發來數據,那麼服務端要使用對應的客戶端對象,並獲取到該 客戶端對象的讀取流讀取發過來的數據
InputStream in = s.getInputStream();
byte[] buf= new byte[1024]
int len = in.read(buf);
4,關閉服務端(可選)。關閉客戶端

3,上傳時要注意:定義一個結束標誌可以自己定義時間戳,也可以使用shutdownOutput()  和 shutdownInput()方法來結束

4,服務端的併發登陸要使用多線程來完成 。 根據循環後的結束來判斷,,定義標記


六,自定義瀏覽器(一定要注意加空行)

1,瀏覽器會向服務器提交一個http請求消息頭(如下):
GET / HTTP/1.1   GET是一種請求方法POST也是一種請求方式   後面是路徑 空格 HTTP/1.1  http的版本
Host: localhost:10022  明確主機,端口
Connection: keep-alive  連接狀態(close)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  支持的格式
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/32.0.1700.107 Safari/537.36  用戶信息
Accept-Encoding: gzip,deflate,sdch 支持的數據封裝形式 提高傳輸效率。 
Accept-Language: zh-CN,zh;q=0.8   支持的語言

請求數據頭和請求數據體必須用空行隔開進行區分。

2,http應答消息頭

HTTP/1.1 200 OK  支持版本  200 響應代碼 響應成功
Server: Apache-Coyote/1.1 服務器版本
Accept-Ranges: bytes
ETag: W/"182-1395197359758"  標記
Last-Modified: Wed, 19 Mar 2014 02:49:19 GMT 最後一次修改時間
Content-Type: text/html  數據類型
Content-Length: 182  數據的大小  字節
Date: Wed, 19 Mar 2014 03:36:27 GMT
Connection: close


七,URL類(將url封裝成的對象)

1,類 URL 代表一個統一資源定位符,它是指向互聯網“資源”的指針。資源可以是簡單的文件或目錄,
也可以是對更爲複雜的對象的引用,例如對數據庫或搜索引擎的查詢。
URI(表示一個統一資源標識符 (URI) 引用。 )的範圍要比URL的範圍大
2,
構造函數:
URL(String spec)   根據 String 表示形式創建 URL 對象。
URL(String protocol, String host, int port, String file)   根據指定 protocol、host、port 號和 file 創建 URL 對象。

方法
public String getFile()獲取此 URL 的文件名。此 URL 的文件名,如果沒有文件名,則返回一個空字符串==getPath()+getQuery()
public String getHost()獲取此 URL 的主機名
public String getPath()獲取此 URL 的路徑部分。 返回:此 URL 的路徑部分,如果沒有路徑,則返回一個空字符串
public int getPort()獲取此 URL 的端口號。 返回:端口號,如果未設置端口號,則返回 -1,
public String getProtocol()獲取此 URL 的協議名稱。 
public String getQuery()獲取此 URL 的查詢部分。 返回:此 URL 的查詢,如果沒有查詢,則返回 null

public URLConnection openConnection()   throws IOException返回一個 URLConnection 對象,只要調用此方法url就會自動遠程連接這臺主機,獲取連接對象
不用寫socket服務了
public final InputStream openStream()     throws IOException
打開到此 URL 的連接並返回一個用於從該連接讀入的 InputStream。此方法是下面方法的縮寫:  openConnection().getInputStream()



如果getPort 返回-1時,我會給其設置一個默認端口號

八,URLConnection(抽象類)應用層  不會關閉


1,子類
HttpURLConnection
JarURLConnection

2,方法:
URLConnection(URL url)        構造一個到指定 URL 的 URL 連接。
InputStream  getInputStream();返回讀取流
OutputStream getOutputStream()返回寫入流

九。域名解析


1,想要將主機名翻譯成ip地址,需要域名解析DNS
2,配置DNS服務器:
不配置會走默認的DNS服務器 電信的寬帶可以配置成聯通的dns服務器,,選擇近的dns服務器進行配置
會請求超時
3,其實127.0.0.1和localhost的映射關係就在本機上。
c:\windows\systems\drivers\ext\host文件中

在文件中可以進行ip地址設置
可以提高訪問速度
可以屏蔽網站(軟件註冊時會先找這個文件,如果沒有找到纔會去找dns)


---------------------- ASP.Net+Unity開發.Net培訓、期待與您交流! ----------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章