通訊協議大概分五層。
分層優勢
:
不須要管具體實現,只須要作本身的事情。
分層標準:
OSI
參考模型
TCP/IP
參考模型
TCP/IP
詳解(瞭解網絡底層的書)
IPV6
的相關問題
TCP
爲可靠的因特網鏈接
UDP
爲不可靠的因特網鏈接
Socket
的基本概念:
兩個
java
應用程序能夠經過一個雙向的網絡通訊鏈接實現數據交換,這個雙向鏈路的一端稱爲一個
Socket
。
Socket
一般用來實現
client
—
server
鏈接。(
CS
模式,客戶端服務器模式)
java.net
包中定義兩個類
Socket
和
ServerSocket
,分別用來實現雙向連接的
client
和
server
端。
創建鏈接時所需的尋址信息爲遠程計算機的
IP
地址和端口號(
Port number
)
網絡編程:
Socket
編程
ServerSocket
爲TCP
上的服務器端口。
IP
地址和端口號(Port number
)
端口號表示應用程序的識別碼
相似於IP
端口號爲兩個字節最多有65536
個端口
一個應用程序能夠應用多個端口號
注意一點:本身編程佔用端口號時:儘可能用
1024
以上的端口號,由於
1024
如下的端口系統有可能徵用。
關於數據的傳輸使用流的概念。
流的東西在
java.io.*
包中。
在
Socket
端口上有個
getInputStream()
方法
注意:
DataInputStream
類中的
readUTF
();方法也是阻塞式的方法。
ServerSocket
的方法accept()也爲阻塞式的。
因爲readUTF方法爲阻塞式的
則會產生以下問題:
當一個客戶端調用服務器的時候進行通訊調用readUTF()方法時,就會產生阻塞,其餘的客戶端就沒法訪問服務器。
在服務器中使用
Socket
的
getInetAddress
獲取客戶端的端口號
CS
之間的數據傳輸:使用流概念就是:
OutPutStream
和
InPutStream
能夠在各類流上添加相應的處理流。用來方便處理。
如今咱們能夠作一個簡單的聊天程序。
做業。。。。。。。。。
小例子:
客戶端:
import java.net.*;
public class TCPClient
{
public void main(String[] args) throws Exception
{
Socket cl = new Socket("127.0.0.1",6666);//有異常產生,127.0.0.1爲本地IP地址。6666爲端口號
}
}
服務器端:
import java.net.*;public class TCPServer{ public void main(String[] args) throws Exception { ServerSocket a=new ServerSocket(6666);//監聽6666端口號 有異常產生,能夠拋出。 while(true)//服務器端爲死循環,一直循環等待客戶端鏈接。 { Socket s=a.accept();//在服務器上建立一個和客戶端相鏈接的Socket端口,拋出IO異常。這時候只能接受一個客戶端的鏈接,由於一個Acception只能接受一個客戶端鏈接。 //Accept方法爲阻塞式的方法。 System.out.println("鏈接結束"); } }}