生活随笔
收集整理的這篇文章主要介紹了
Java基础day21
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java基礎day21 Java基礎day21-網絡編程 1.網絡編程入門 1.1 網絡編程概述 1.2 網絡編程三要素 1.3 IP地址 1.4InetAddress 2.UDP通信程序 2.1 UDP發送數據 2.2UDP接收數據 2.3UDP通信程序練習 3.TCP通信程序 3.1TCP發送數據 3.2TCP接收數據 3.3TCP通信程序練習 3.4TCP通信程序練習 3.5TCP通信程序練習 3.6TCP通信程序練習【應用】 3.7TCP通信程序練習 3.8TCP通信程序練習
Java基礎day21-網絡編程
1.網絡編程入門
1.1 網絡編程概述
計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統 網絡編程 在網絡通信協議下,實現網絡互連的不同計算機上運行的程序間可以進行數據交換
1.2 網絡編程三要素
IP地址 要想讓網絡中的計算機能夠互相通信,必須為每臺計算機指定一個標識號,通過這個標識號來指定要接收數據的計算機和識別發送的計算機,而IP地址就是這個標識號。也就是設備的標識 端口 網絡的通信,本質上是兩個應用程序的通信。每臺計算機都有很多的應用程序,那么在網絡通信時,如何區分這些應用程序呢?如果說IP地址可以唯一標識網絡中的設備,那么端口號就可以唯一標識設備中的應用程序了。也就是應用程序的標識 協議 通過計算機網絡可以使多臺計算機實現連接,位于同一個網絡中的計算機在進行連接和通信時需要遵守一定的規則,這就好比在道路中行駛的汽車一定要遵守交通規則一樣。在計算機網絡中,這些連接和通信的規則被稱為網絡通信協議,它對數據的傳輸格式、傳輸速率、傳輸步驟等做了統一規定,通信雙方必須同時遵守才能完成數據交換。常見的協議有UDP協議和TCP協議
1.3 IP地址
IP地址:是網絡中設備的唯一標識
IP地址分為兩大類 IPv4:是給每個連接在網絡上的主機分配一個32bit地址。按照TCP/IP規定,IP地址用二進制來表示,每個IP地址長32bit,也就是4個字節。例如一個采用二進制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長的地址,處理起來也太費勁了。為了方便使用,IP地址經常被寫成十進制的形式,中間使用符號“.”分隔不同的字節。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點分十進制表示法”,這顯然比1和0容易記憶得多 IPv6:由于互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網絡地址資源有限,使得IP的分配越發緊張。為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節一組,分成8組十六進制數,這樣就解決了網絡地址資源數量不夠的問題 DOS常用命令: ipconfig:查看本機IP地址 ping IP地址:檢查網絡是否連通 特殊IP地址: 127.0.0.1:是回送地址,可以代表本機地址,一般用來測試使用
1.4InetAddress
InetAddress:此類表示Internet協議(IP)地址
方法名說明 static InetAddress getByName(Stringhost) 確定主機名稱的IP地址。主機名稱可以是機器名稱,也可以是IP地址 String getHostName() 獲取此IP地址的主機名 String getHostAddress() 返回文本顯示中的IP地址字符串
import java
. net
. InetAddress
;
import java
. net
. UnknownHostException
; public class test1 { public static void main ( String
[ ] args
) throws UnknownHostException
{ InetAddress address
= InetAddress
. getByName ( "58.199.157.8" ) ; String name
= address
. getHostAddress ( ) ; String ip
= address
. getHostAddress ( ) ; System
. out
. println ( "主機名" + name
) ; System
. out
. println ( "ip地址" + ip
) ; }
}
1.5端口和協議
端口 設備上應用程序的唯一標識 端口號 用兩個字節表示的整數,它的取值范圍是065535。其中,0 1023之間的端口號用于一些知名的網絡服 務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會 導致當前程序啟動失敗 協議 計算機網絡中,連接和通信的規則被稱為網絡通信協議 UDP協議 用戶數據報協議(User Datagram Protocol) UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外一臺計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。 由于使用UDP協議消耗資源小,通信效率高,所以通常都會用于音頻、視頻和普通數據的傳輸 例如視頻會議通常采用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。但是在使用UDP協議傳送數據時,由于UDP的面向無連接性,不能保證數據的完整性,因此在傳輸重要數據時不建議使用UDP協議 TCP協議 傳輸控制協議 (Transmission Control Protocol) TCP協議是面向連接的通信協議,即傳輸數據之前,在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手” 三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠 第一次握手,客戶端向服務器端發出連接請求,等待服務器確認 第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求 第三次握手,客戶端再次向服務器端發送確認信息,確認連接 完成三次握手,連接建立后,客戶端和服務器就可以開始進行數據傳輸了。由于這種面向連接的特性,TCP協議可以保證傳輸數據的安全,所以應用十分廣泛。例如上傳文件、下載文件、瀏覽網頁等
2.UDP通信程序
2.1 UDP發送數據
Java中的UDP通信 UDP協議是一種不可靠的網絡協議,它在通信的兩端各建立一個Socket對象,但是這兩個Socket只是發 送,接收數據的對象,因此對于基于UDP協議的通信雙方而言,沒有所謂的客戶端和服務器的概念 Java提供了DatagramSocket類作為基于UDP協議的Socket 構造方法
方法名說明 DatagramSocket() 創建數據報套接字并將其綁定到本機地址上的任何可用端口 DatagramPacket(byte[] buf,int len,InetAddress add,int port) 創建數據包,發送長度為len的數據包到指定主機的指定端口
方法名說明 void send(DatagramPacket p) 發送數據報包 void close() 關閉數據報套接字 void receive(DatagramPacket p) 從此套接字接受數據報包
import java
. io
. IOException
;
import java
. net
. *
; public class test2 { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( ) ; byte [ ] bys
= "hello,udp,我來了" . getBytes ( ) ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
, InetAddress
. getByName ( "58.199.157.8" ) , 10086 ) ; ds
. send ( dp
) ; ds
. close ( ) ; }
}
2.2UDP接收數據
接收數據的步驟 創建接收端的Socket對象(DatagramSocket) 創建一個數據包,用于接收數據 調用DatagramSocket對象的方法接收數據 解析數據包,并把數據在控制臺顯示 關閉接收端 構造方法
方法名說明 DatagramPacket(byte[] buf, int len) 創建一個DatagramPacket用于接收長度為len的數據包
方法名說明 byte[] getData() 返回數據緩沖區 int getLength() 返回要發送的數據的長度或接收的數據的長度
import java
. io
. IOException
;
import java
. net
. DatagramPacket
;
import java
. net
. DatagramSocket
; public class test3 { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( 13456 ) ; while ( true ) { byte [ ] bys
= new byte [ 1024 ] ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
) ; ds
. receive ( dp
) ; System
. out
. println ( "數據是:" + new String ( dp
. getData ( ) , 0 , dp
. getLength ( ) ) ) ; } }
}
2.3UDP通信程序練習
案例需求 UDP發送數據:數據來自于鍵盤錄入,直到輸入的數據是886,發送數據結束 UDP接收數據:因為接收端不知道發送端什么時候停止發送,故采用死循環接收 代碼實現
public class Send { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } byte [ ] bys
= line
. getBytes ( ) ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
, InetAddress
. getByName ( "58.199.157.8" ) , 12345 ) ; ds
. send ( dp
) ; } ds
. close ( ) ; }
} import java
. io
. IOException
;
import java
. net
. DatagramPacket
;
import java
. net
. DatagramSocket
;
public class Receive { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( 12345 ) ; while ( true ) { byte [ ] bys
= new byte [ 1024 ] ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
) ; ds
. receive ( dp
) ; System
. out
. println ( "數據是:" + new String ( dp
. getData ( ) , 0 , dp
. getLength ( ) ) ) ; }
}
}
3.TCP通信程序
3.1TCP發送數據
Java中的TCP通信 Java對基于TCP協議的的網絡提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket產生IO流來進行網絡通信。 Java為客戶端提供了Socket類,為服務器端提供了ServerSocket類 構造方法
方法名說明 Socket(InetAddress address,int port) 創建流套接字并將其連接到指定IP指定端口號 Socket(String host, int port) 創建流套接字并將其連接到指定主機上的指定端口號
方法名說明 InputStream getInputStream() 返回此套接字的輸入流 OutputStream getOutputStream() 返回此套接字的輸出流
3.2TCP接收數據
方法名說明 ServletSocket(int port) 創建綁定到指定端口的服務器套接字
方法名說明 Socket accept() 監聽要連接到此的套接字并接受它
import java
. io
. IOException
;
import java
. io
. OutputStream
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15800 ) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "hello,tcp,我來了" . getBytes ( ) ) ; s
. close ( ) ; }
}
import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15800 ) ; Socket s
= ss
. accept ( ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "數據是:" + data
) ; s
. close ( ) ; ss
. close ( ) ; }
}
3.3TCP通信程序練習
案例需求 客戶端:發送數據,接受服務器反饋 服務器:收到消息后給出反饋 案例分析 客戶端創建對象,使用輸出流輸出數據 服務端創建對象,使用輸入流接受數據 服務端使用輸出流給出反饋數據 客戶端使用輸入流接受反饋數據 代碼實現
import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. io
. OutputStream
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "hello,tcp,我來了" . getBytes ( ) ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "客戶端:" + data
) ; s
. close ( ) ; }
} import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. io
. OutputStream
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "服務器:" + data
) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "數據已經收到" . getBytes ( ) ) ; ss
. close ( ) ; }
}
3.4TCP通信程序練習
案例需求 客戶端:數據來自于鍵盤錄入, 直到輸入的數據是886,發送數據結束 服務端:接收到數據在控制臺輸出 案例分析 客戶端創建對象,使用鍵盤錄入循環接受數據,接受一行發送一行,直到鍵盤錄入886為止 服務端創建對象,使用輸入流按行循環接受數據,直到接受到null為止 代碼實現
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. close ( ) ; }
} import java
. io
. BufferedReader
;
import java
. io
. IOException
;
import java
. io
. InputStreamReader
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { System
. out
. println ( line
) ; } ss
. close ( ) ; }
}
3.5TCP通信程序練習
案例需求 客戶端:數據來自于鍵盤錄入,直到輸入的數據是886,發送數據結束 服務端:接受到的數據寫入文本文件中 案例分析 客戶端創建對象,使用鍵盤錄入循環接受數據,接受一行發送一行,直到鍵盤錄入886為止 服務端創建對象,創建輸出流對象指向文件,每接受一行數據后使用輸出流輸出到文件中,直到接受到 null為止 代碼實現
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; BufferedWriter bw
= new BufferedWriter ( new FileWriter ( "src\\s.txt" ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } bw
. close ( ) ; ss
. close ( ) ; }
}
3.6TCP通信程序練習【應用】
案例需求 客戶端:數據來自于文本文件 服務器:接收到的數據寫入文本文件 案例分析 創建客戶端,創建輸入流對象指向文件,從文件循環讀取數據,每讀取一行就使用輸出流給服務器輸出一行 創建服務端,創建輸出流對象指向文件,從客戶端接受數據,每接受一行就給文件中輸出一行 代碼實現
在這里插入代碼片
3.7TCP通信程序練習
案例需求 客戶端:數據來自于文本文件,接收服務器反饋 服務器:接收到的數據寫入文本文件,給出反饋 案例分析 創建客戶端對象,創建輸入流對象指向文件,每讀入一行數據就給服務器輸出一行數據,輸出結束后使 用shutdownOutput()方法告知服務端傳輸結束 創建服務器對象,創建輸出流對象指向文件,每接受一行數據就使用輸出流輸出到文件中,傳輸結束 后。使用輸出流給客戶端反饋信息 客戶端接受服務端的回饋信息 相關方法
方法名說明 void shutdownInput() 將此套接字的輸入流放置在“流的末尾” void shutdownOutput() 禁止用此套接字的輸出流
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } br
. close ( ) ; s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; BufferedWriter bw
= new BufferedWriter ( new FileWriter ( "src\\s.txt" ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } bw
. close ( ) ; ss
. close ( ) ; }
}
3.8TCP通信程序練習
案例需求 客戶端:數據來自于文本文件,接收服務器反饋 服務器:接收到的數據寫入文本文件,給出反饋,代碼用線程進行封裝,為每一個客戶端開啟一個線程 案例分析 創建客戶端對象,創建輸入流對象指向文件,每讀入一行數據就給服務器輸出一行數據,輸出結束后使 用shutdownOutput()方法告知服務端傳輸結束 創建多線程類,在run()方法中讀取客戶端發送的數據,為了防止文件重名,使用計數器給文件名編號, 接受結束后使用輸出流給客戶端發送反饋信息。 創建服務端對象,每監聽到一個客戶端則開啟一個新的線程接受數據。 客戶端接受服務端的回饋信息 代碼實現
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new FileReader ( "src\\fw.txt" ) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. shutdownOutput ( ) ; BufferedReader brClient
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; String data
= brClient
. readLine ( ) ; System
. out
. println ( "服務器的反饋:" + data
) ; br
. close ( ) ; s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. Socket
; public class ServerThread implements Runnable { private Socket s
; public ServerThread ( Socket s
) { this . s
= s
; } @Override public void run ( ) { try { BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; int count
= 0 ; File file
= new File ( "src\\Copy[" + count
+ "].java" ) ; while ( file
. exists ( ) ) { count
++ ; file
= new File ( "src\\Copy[" + count
+ "].java" ) ; } BufferedWriter bw
= new BufferedWriter ( new FileWriter ( file
) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } BufferedWriter bwServer
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; bwServer
. write ( "文件上傳成功" ) ; bwServer
. newLine ( ) ; bwServer
. flush ( ) ; s
. close ( ) ; } catch ( IOException e
) { e
. printStackTrace ( ) ; } }
} import java
. io
. IOException
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; while ( true ) { Socket s
= ss
. accept ( ) ; new Thread ( new ServerThread ( s
) ) . start ( ) ; } }
}
總結
以上是生活随笔 為你收集整理的Java基础day21 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。