---------------------- 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)