網絡編程
計算機網絡
是指將地理位置不同的具有獨立功能的多態計算機及其外部設備,通過通信線路連接起來,在網絡操作系,網絡管理軟件及網絡通信協議的管理和協調下管理和協調下.實現資源共享和信息傳遞的計算機系統.
網絡編程
就是用來實現網絡互連的不同計算機上運行的程序間可以進行數據交換.
網絡編程
網絡模型概述
計算機網絡之間以何種規則進行通信,就是網絡模型研究問題。
網絡模型一般是指
OSI(Open System Interconnection開放系統互連)七層參考模型
TCP/IP四層參考模型
主機至網絡層(物理層 , 數據鏈路層) , 網際層 , 傳輸層 , 應用層(應用層 , 表示層 , 會話層)
網絡模型7層概述:
- 1.物理層:主要定義物理設備標準,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。
它的主要作用是傳輸比特流(就是由1、0轉化爲電流強弱來進行傳輸,到達目的地後在轉化爲1、0)。
這一層的數據叫做比特。 -
- 數據鏈路層:主要將從物理層接收的數據進行MAC地址(網卡的地址)的封裝與解封裝。常把這一層的數據叫做幀。在這一層工作的設備是交換機,數據通過交換機來傳輸。
-
- 網絡層:主要將從下層接收到的數據進行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的設備是路由器,常把這一層的數據叫做數據包。
-
- 傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。
主要是將從下層接收的數據進行分段和傳輸,到達目的地址後再進行重組。常常把這一層數據叫做段。
- 傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。
- 5.會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數據傳輸的通路。
主要在你的系統之間發起會話或者接受會話請求(設備之間需要互相認識可以是IP也可以是MAC或者是主機名) - 6.表示層:主要是進行對接收的數據進行解釋、加密與解密、壓縮與解壓縮等(也就是把計算機能夠識別的東西轉換成人能夠能識別的東西(如圖片、聲音等)。
- 7.應用層: 主要是一些終端的應用,比如說FTP(各種文件下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們在電腦屏幕上可以看到的東西.就是終端應用)。
網路編程三要素
- IP地址:InetAddress: 網絡中設備的標識,不易記憶,可用主機名
- 端口號: 用於標識進程的邏輯地址,不同進程的標識
- 傳輸協議: 通訊的規則常見協議:TCP,UDP
IP
- IP概述:所謂IP地址就是給每個連接在Internet上的主機分配的一個32bit地址。
- IP地址的組成
IP地址 = 網絡地址+主機地址
A類IP地址:第一段號碼爲網絡地址,剩下的三段號碼爲本地計算機的號碼
B類IP地址:前二段號碼爲網絡地址,剩下的二段號碼爲本地計算機的號碼
C類IP地址:前三段號碼爲網絡地址,剩下的一段號碼爲本地計算機的號碼 - IP地址分類
A類 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互聯網上不使用,而被用在局域網絡中的地址)
(2)127.X.X.X是保留地址,用做循環測試用的。
B類 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。
C類 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D類 224.0.0.1---239.255.255.254
E類 240.0.0.1---247.255.255.254 - 特殊地址
127.0.0.1 迴環地址,可用於測試本機的網絡是否有問題. ping 127.0.0.1
DOS命令 ipconfig:查看本機IP地址
xxx.xxx.xxx.255 廣播地址端口
- 端口
物理端口 網卡口
邏輯端口 我們指的就是邏輯端口
a:每個網絡程序都會有一個邏輯端口
b:用於標識進程的邏輯地址,不同進程的標識
c:有效端口:0~65535(兩個字節),其中0~1023系統使用或保留端口。協議
UDP
將數據源和目的封裝成數據包中,不需要建立連接;
每個數據報的大小在限制在64k;
因無連接,是不可靠協議;
不需要建立連接,速度快
TCP
建立連接,形成傳輸數據的通道;
在連接中進行大數據量傳輸;
需要連接所以是可靠協議;
必須建立連接,效率會稍低InetAddress類
獲取主機名的 DOS 命令 :hostname
- A:InetAddress類的概述
爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用
此類表示互聯網協議 (IP) 地址。 - B:InetAddress類的常見功能
public static InetAddress getByName(String host)
public String getHostAddress()//獲取IP
public String getHostName()//獲取主機名
getLocalHost(); - C:案例演示: InetAddress類的常見功能
InetAddress inetAddress = InetAddress.getByName("SHEN-MOU-MOU") ;
InetAddress inetAddress = InetAddress.getByName("192.168.3.120") ;Socket
Socket=IP+端口號
- Socket套接字概述:
網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。 - Socket原理機制:
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO傳輸。UDP
步驟:// public DatagramSocket(int port)
- a: 創建UDP通訊協議服務器端對象(DatagramSocket) 注意要用有參數構造 指定端口號
- b: 創建數據報包,作用用來接收數據 // public DatagramPacket(byte[] buf, int length)
- c: 接收數據 receive(dp) ;
- d: 解析數據報包,拿出數據 dp.getData() ; dp.getLength() ;
-
e: 釋放資源
列:
public class UDPClient {
public static void main(String[] args) throws IOException {
//UDP 客戶端
//1.創建客戶端Socket
// DatagramSocket( int port, InetAddress laddr) 創建數據報套接字,將其綁定到指定的本地地址。DatagramSocket socket = new DatagramSocket(); //DatagramPacket( byte[] buf, int length, InetAddress address,int port) //構造數據報包,用來將長度爲 length 的包發送到指定主機上的指定端口號。 //2.發送數據 DatagramPacket 數據報包 byte[] bytes = "你好UDP".getBytes(); DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.8.123"), 9898); socket.send(packet); //3.釋放資源 socket.close();
}
}
public class UDPServer {
public static void main(String[] args) throws IOException {
//創建服務端的套接字
//DatagramSocket( int port)
//創建數據報套接字並將其綁定到本地主機上的指定端口。
DatagramSocket socket = new DatagramSocket(9898);
//接收數據
//DatagramPacket( byte[] buf, int length)
//構造 DatagramPacket,用來接收長度爲 length 的數據包。
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
System.out.println("服務器已經開啓等待接收收據...");
socket.receive(datagramPacket); //阻塞在這裏,等待接收數據
System.out.println("下來了");
//取出數據報包中的數據
byte[] data = datagramPacket.getData();
//把數據轉成字符串
System.out.println(new String(data, 0, datagramPacket.getLength()));//釋放資源 socket.close();
}
案例演示
TCP上傳文本文件並給出反饋
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("192.168.8.123", 9999);
//獲取通道中的輸出流
OutputStream out = socket.getOutputStream();
//包裝通道中的輸出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//創建一個輸入流,來關聯這個文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
//客戶端,已經傳完了
socket.shutdownOutput();//關閉輸出通道,服務端那邊就不會阻塞了
//我要讀取服務端的反饋
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
reader.close();
socket.close();
}
}
public class TCPServer {
public static void main(String[] args) throws IOException {
//服務端上傳文件完成了之後,給客戶端一個反饋
ServerSocket ss = new ServerSocket(9999);
System.out.println("服務器已經開啓....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//把通道中的輸入流包裝成字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//關聯一個輸出流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("msg1.txt"));
String line=null;
while ((line=reader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
System.out.println("=====================");
//保存完畢後,給客戶端一個反饋
OutputStream outputStream = socket.getOutputStream();
outputStream.write("文件上傳成功".getBytes());
//釋放資源
bufferedWriter.close();
ss.close();
}
}