您好,登錄后才能下訂單哦!
本篇內容介紹了“Java網絡編程基礎知識整理”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
網絡編程
1.1 概述
1.2、網絡通信的要素
1.網絡編程中有兩個主要的問題
2.網絡編程中的三要素
1.3、IP
1.4、端口
1.5、通信協議
UDP協議
TCP協議
1.6、TCP模擬通信
客戶端
文件上傳
1.7、UDP
1.8、URL
實例:
如何實現網絡通信?
如何定位到網絡上的一臺或者多臺主機
使用cmd——>ping命令,ping一個域名,可以看到訪問的主機的IP地址
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ztQmkDEl-1628853105623)(D:\learningappDataSave\Typora\image\image-20210809212819370.png)]
找到主機之后,如何進行通信。
IP
端口號
網絡通信協議(udp,tcp類)
要想讓網絡中的計算機能夠互相通信,必須為每臺計算機指定一個標識號,通過這個標識號來指定要接收數據的計算機和識別發送的計算機,而lP地址就是這個標識號。也就是設備的標識
ip地址:InetAddress
使用IP可以唯一定位一臺網絡上的計算機
本機IP 127.0.0.1 本機localhost(唯一一個沒網也能ping得通得ip)
ip地址的分類
ipv4/ipv6
公網(互聯網)/私網(局域網)
可以用InetAddress查詢Ip地址。
public class TestInetAddress { public static void main(String[] args) { try { //查詢網站IP地址 InetAddress ip1 = InetAddress.getByName("www.baidu.com"); System.out.println(ip1);//www.baidu.com/163.177.151.109 //查詢本機 InetAddress ip2 = InetAddress.getLocalHost(); System.out.println(ip2);//飛雷神/192.168.153.1 } catch (UnknownHostException e) { e.printStackTrace(); } } }
還有一個InetSocketAddress類
網絡的通信,本質上是兩個應用程序的通信。每臺計算機都有很多的應用程序,那么在網絡通信時,如何區分這些應用程序呢?如果說IP地址可以唯一標識網絡中的設備,那么端口號就可以唯一標識設備中的應用程序了。也就是應用程序的標識
不同的進程有不同的端口號,用來區分應用程序
被規定
TCP 0~65535
UDP 0~65535
單個協議下,端口不沖突就可以使用。
端口分類
HTTP:80
HTTPS:443
FTP:21
Telent:23
公有端口0~1023
程序注冊端口012~49151
Tomcat:80
mysql:3306
Oracle:1521
動態、私有
協議:計算機網絡中,連接和通信的規則被稱為網絡通信協議
用戶數據報協議(User Datagram Protocol)
UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外一臺計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。
由于使用UDP協議消耗資源小,通信效率高,所以通常都會用于音頻、視頻和普通數據的傳輸
例如視頻會議通常采用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。但是在使用UDP協議傳送數據時,由于UDP的面向無連接性,不能保證數據的完整性,因此在傳輸重要數據時不建議使用UDP協議
傳輸控制協議(Transmission Control Protocol)
TCP協議是面向連接的通信協議,即傳輸數據之前,在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”
三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠
第一次握手,客戶端向服務器端發出連接請求,等待服務器確認
第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求
第三次握手,客戶端再次向服務器端發送確認信息,確認連接
形象記憶 三次握手(連接) A:你愁啥? 發送請求 B:瞅你咋地? 回應請求 A:來干一場! 確認鏈接 四次揮手:(斷開)
1.連接服務器
2.發送消息
import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; //客戶端 public class TcpClientDemo01 { private static OutputStream os; private static Socket socket; public static void main(String[] args) { try { //1.獲得服務器的地址、端口號 InetAddress serverIP = InetAddress.getByName("127.0.0.1"); int port=9999;//服務器的端口號 //2.創建一個Sock連接 socket = new Socket(serverIP,port); //使用該鏈接發送IO流消息 os = socket.getOutputStream(); os.write("你好,吃飯了嗎?".getBytes()); } catch (IOException e) { e.printStackTrace(); }finally {//關閉資源 if(os!=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
1.建立服務的端口
2.等待用戶連接
3.接收用戶的消息
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo01 { private static ServerSocket serverSocket; private static Socket socket; private static InputStream stream; private static ByteOutputStream baos; public static void main(String[] args) throws IOException { try { //給自己一個地址,端口號 serverSocket = new ServerSocket(9999); while(true) { //等待客戶端連接 socket = serverSocket.accept(); //讀取客戶端的消息 stream = socket.getInputStream(); //管道流 baos = new ByteOutputStream(); byte[] bytes = new byte[1024]; int len; while ((len = stream.read(bytes)) != -1) { baos.write(bytes, 0, len); } System.out.println(baos.toString()); } } catch (IOException e) { e.printStackTrace(); }finally { baos.close(); try { stream.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); } serverSocket.close(); } } }
客服端上傳文件
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class TcpClientDemo02 { public static void main(String[] args) throws Exception { //創建一個Socket連接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); //socket的輸出流 OutputStream os = socket.getOutputStream(); //讀取文件的流 FileInputStream fis = new FileInputStream("bg.jpeg"); //寫出文件 byte[] bytes = new byte[1024];//緩沖區 int len; while ((len = fis.read(bytes)) != -1) {//讀到緩沖區 os.write(bytes, 0, len);//從緩沖區寫到輸出流 } //通知服務器,我已經上傳完成 socket.shutdownOutput(); //接收確定服務器接收完畢的信息,斷開連接 InputStream inputStream = socket.getInputStream(); ByteOutputStream bost = new ByteOutputStream(); byte[] bytes2 = new byte[1024]; int len2; while ((len2 = inputStream.read(bytes2)) != -1) { bost.write(bytes2,0,len2); } System.out.println(bost.toString()); //關閉資源 bost.close(); inputStream.close(); fis.close(); os.close(); socket.close(); } }
服務器接收文件
package com.yong.tcp; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo02 { public static void main(String[] args) throws IOException { //創建鏈接 ServerSocket serverSocket = new ServerSocket(9000); //監聽客戶端的連接 Socket socket = serverSocket.accept(); //獲取輸入流 InputStream inputStream = socket.getInputStream();//阻塞式監聽,會一直等待 //文件輸出 FileOutputStream fos = new FileOutputStream("receiver.jpeg"); byte[] bytes = new byte[1024]; int len; while ((len = inputStream.read(bytes)) != -1) { fos.write(bytes, 0, len); } //通知客戶端,我已接收完畢 OutputStream os = socket.getOutputStream(); os.write("我接收完畢了,可以斷開鏈接了".getBytes()); //關閉資源 os.close(); fos.close(); inputStream.close(); socket.close(); serverSocket.close(); } }
UDP消息發送(聊天實現)
發送方
package com.yong.chat; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class ChatSendDemo01 { public static void main(String[] args) throws Exception { //建立一個端口 DatagramSocket socket = new DatagramSocket(8888); //建立一個包裹 //準備數據,從控制臺 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String data = reader.readLine();//控制臺控制輸入 byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, data.length(), new InetSocketAddress("localhost", 9999)); //發送包裹 socket.send(packet); if ("bye".equals(data)) { break; } } socket.close(); } }
接收方
import java.net.DatagramPacket; import java.net.DatagramSocket; public class ChatReceiverDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(9999); while (true) { //準備接收包裹 byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length); socket.receive(packet);//阻塞式接受包裹 byte[] data = packet.getData();//拿出消息 String receiveData = new String(data, 0, data.length);//轉為字符串,注意不要導錯包 System.out.println(receiveData); //退出接收 if ("bye".equals(receiveData.trim())) { break; } } socket.close(); } }
爬取網絡資源,url是網絡資源的地址
import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class UrlDown { public static void main(String[] args) throws Exception { //下載地址, URL url = new URL("https://m701.music.126.net/20210813190206/833ba2325a035b223f2f315a7a5b1d4f/jdyyaac/0353/055e/565e/4910a621a524e5158013a4ccdad535d9.m4a"); //連接到這個資源 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); FileOutputStream fos = new FileOutputStream("富士山下(陳奕迅).m4a"); byte[] bytes = new byte[1024]; int len; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); } fos.close(); is.close(); connection.disconnect();//斷開連接 } }
“Java網絡編程基礎知識整理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。