通信協議大概分五層。
分層優點: 不需要管具體實現,只需要做自己的事情。
分層標準:
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爲端口號
}
}
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("連接結束");
}
}
}
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("連接結束");
}
}
}