目錄
一、網(wǎng)絡(luò)基本介紹
1、什么是網(wǎng)絡(luò)通信?
2、網(wǎng)絡(luò)
3、IP地址
4、域名
5、網(wǎng)絡(luò)通信協(xié)議
6、Socket
二、TCP網(wǎng)絡(luò)通信編程
?1、應(yīng)用實(shí)例1(字節(jié)流)
2、應(yīng)用實(shí)例2(字節(jié)流)
3、應(yīng)用實(shí)例3(字符流)
4、netstat 指令
三、UDP網(wǎng)絡(luò)通信編程?
1、基本介紹
2、基本流程
3、應(yīng)用實(shí)例
一、網(wǎng)絡(luò)基本介紹
1、什么是網(wǎng)絡(luò)通信?
????????兩臺設(shè)備之間通過網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)傳輸,將數(shù)據(jù)通過網(wǎng)絡(luò)從一臺設(shè)備傳輸?shù)搅硪慌_設(shè)備。在java.net包下提供了一系列的類或接口,供程序員使用,完成網(wǎng)絡(luò)通信。
2、網(wǎng)絡(luò)
????????概念:?兩臺或多臺設(shè)備通過一定物理設(shè)備連接起來構(gòu)成了網(wǎng)絡(luò)
????????根據(jù)網(wǎng)絡(luò)的覆蓋范圍不同,對網(wǎng)絡(luò)進(jìn)行分類:
????????????????局域網(wǎng): 覆蓋范圍最小,僅僅覆蓋一個教室或一個機(jī)房
????????????????城域網(wǎng):?覆蓋范圍較大,可以覆蓋一個城市
????????????????廣域網(wǎng): 覆蓋范圍最大, 可以覆蓋全國,甚至全球,萬維網(wǎng)是廣域網(wǎng)的代表
3、IP地址
? ? ? ? ① 概念: 用于唯一標(biāo)識網(wǎng)絡(luò)中的每臺計算機(jī)/主機(jī)
????????② 查看ip地址: ipconfig
????????③ ip地址的表示形式: 點(diǎn)分十進(jìn)制XX.XX.XX.XX????????④ 每一個十進(jìn)制數(shù)的范圍:0~255
????????⑤ ip地址的組成=網(wǎng)絡(luò)地址+主機(jī)地址,比如: 192.168.16.69????????⑥ iIPV6是互聯(lián)網(wǎng)工程任務(wù)組設(shè)計的用于替代IPv4的下一代IP協(xié)議,其地址數(shù)量號稱可以為全世界的每一粒沙子編上一個地址。
????????⑦由于IPV4最大的問題在于網(wǎng)絡(luò)地址資源有限,嚴(yán)重制約了互聯(lián)網(wǎng)的應(yīng)用和發(fā)展。 IPv6的使用, 不僅能解決網(wǎng)絡(luò)地址資源數(shù)量的問題,而且也解決了多種接入設(shè)備連入互聯(lián)網(wǎng)
的障礙。????????
? ? ? ?? IPV4的地址分類
?????????? 類型的范圍
?補(bǔ)充特殊:127.0.0.1? 表示本機(jī)地址
4、域名
????????①例如百度的域名:www.baidu.com
????????②好處: 為了方便記憶, 解決記IP的困難
????????③概念: 將IP地址映射成域名,這里怎么映射上,HTTP協(xié)議
????????④端口號????????????????? 概念: 用于標(biāo)識計算機(jī)上某個特定的網(wǎng)絡(luò)程序
????????????????? 表示形式: 以整數(shù)形式,端口范圍0~65535[2個字節(jié)表示端口0~2A16-1]
????????????????? 0~1024已經(jīng)被占用,比如 ssh 22, ftp 21, smtp 25 http 80
????????????????? 常見的網(wǎng)絡(luò)程序端口號:
????????????????????????tomcat: 8080????????????????????????mysqk: 3306
????????????????????????oracle: 1521
????????????????????????sqlserver: 1433
5、網(wǎng)絡(luò)通信協(xié)議
(1)協(xié)議(tcp/ip):
????????TCP/IP (Transmission Control Protocol/internet Protocol)的簡寫中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個協(xié)議是Internet最基本的協(xié)議、 Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ), 簡單地說,就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。
(2)TCP 和 UDP
?????? TCP協(xié)議:傳輸控制協(xié)議
? ? ? ? ?① 使用TCP議前,須先建立TCP連接,形成傳輸數(shù)據(jù)通道傳輸前,采用”三次握手”方式,是可靠的? ? ? ? ? ② TCP議進(jìn)行通信的兩個應(yīng)用進(jìn)程:客戶端、服務(wù)端
??????????③ 在連接中可進(jìn)行大數(shù)據(jù)量的傳輸
??????????④ 傳輸完畢, 需釋放已建立的連接,效率低
??????? UDP協(xié)議:用戶數(shù)據(jù)協(xié)議
??????????① 將數(shù)據(jù)、源、目的封裝成數(shù)據(jù)包,不需要建立連接,因無需連接, 故是不可靠的??????????② 每個數(shù)據(jù)報的大小限制在64K內(nèi),不適合傳輸大量數(shù)據(jù)
??????????③ 發(fā)送數(shù)據(jù)結(jié)束時無需釋放資源(因?yàn)椴皇敲嫦蜻B接的)速度快
補(bǔ)充:InetAddress 類
? ? ? ? getLocalHost:獲取本機(jī)InetAddress對象
????????getByName:根據(jù)指定主機(jī)名/域名獲取ip地址對象
????????getHostName:獲取inetAddress對象的主機(jī)名
????????getHostAddress:獲取inetAddress對象的地址
6、Socket
? ? ? ?? 套接字(Socket)開發(fā)網(wǎng)絡(luò)應(yīng)用程序被廣泛采用,以至于成為事實(shí)上的標(biāo)準(zhǔn)
???????? 通信的兩端都要有Socket, 是兩臺機(jī)器間通信的端點(diǎn)。網(wǎng)絡(luò)通信其實(shí)就是Socket間的通信。
???????? Sochet許程序把網(wǎng)絡(luò)連接當(dāng)成一個流,數(shù)據(jù)在兩個Socket同通IO傳輸
???????? 一般主動發(fā)起通信的應(yīng)用程序?qū)倏蛻舳? 等待通信請求的為服務(wù)端
二、TCP網(wǎng)絡(luò)通信編程
?
?1、應(yīng)用實(shí)例1(字節(jié)流)
? 服務(wù)端:
public class SocketTCP01Server { public static void main(String[] args) throws IOException { //1、在本機(jī)的9999端口監(jiān)聽,等待鏈接 // 細(xì)節(jié):要求本機(jī)沒有其他服務(wù)在監(jiān)聽9999端口 // 細(xì)節(jié):這個ServerSocket 可以通過accept 返回多個Socket[多個客戶端連接服務(wù)器的并發(fā)] ServerSocket serverSocket = new ServerSocket(9999); System.out.println("服務(wù)端在監(jiān)聽9999端口,等待連接......"); //2、當(dāng)沒有客戶端連接9999端口時,程序會阻塞,等待連接 // 如果有程序連接,則返回Socket對象,程序進(jìn)行執(zhí)行 Socket socket = serverSocket.accept(); System.out.println("服務(wù)端 socket = " + socket.getClass()); //3、通過 讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù),顯示 InputStream inputStream = socket.getInputStream(); //4、IO讀取 byte[] buf = new byte[1024]; int readline = 0; while ((readline = inputStream.read(buf)) != -1){ //根據(jù)讀取到的實(shí)際長度,顯示內(nèi)容 System.out.println(new String(buf, 0,readline)); } //5、關(guān)閉流 inputStream.close(); socket.close(); serverSocket.close(); } }
? 客戶端:
public class SocketTCP01Client { public static void main(String[] args) throws IOException { //連接服務(wù)端(ip ,接口) //解析:連接本機(jī)的9999端口,如果連接成功,則返回Socket對象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客戶端 socket = " + socket.getClass()); //2、連接上后,生成Socket,通過 // 得到 和 socket對象相關(guān)聯(lián)的輸出流對象socket.getOutputStream() OutputStream outputStream = socket.getOutputStream(); //3、通過輸出流,寫入數(shù)據(jù)到 數(shù)據(jù)通道 outputStream.write("hello,server".getBytes()); //4、關(guān)閉流對象和socket對象 outputStream.close(); socket.close(); System.out.println("客戶端退出....."); } }
2、應(yīng)用實(shí)例2(字節(jié)流)
? 服務(wù)端:
public class SocketTCP02Server { public static void main(String[] args) throws IOException { //1、在本機(jī)的9999端口監(jiān)聽,等待鏈接 // 細(xì)節(jié):要求本機(jī)沒有其他服務(wù)在監(jiān)聽9999端口 // 細(xì)節(jié):這個ServerSocket 可以通過accept 返回多個Socket[多個客戶端連接服務(wù)器的并發(fā)] ServerSocket serverSocket = new ServerSocket(9999); System.out.println("服務(wù)端在監(jiān)聽9999端口,等待連接......"); //2、當(dāng)沒有客戶端連接9999端口時,程序會阻塞,等待連接 // 如果有程序連接,則返回Socket對象,程序進(jìn)行執(zhí)行 Socket socket = serverSocket.accept(); System.out.println("服務(wù)端 socket = " + socket.getClass()); //3、通過 讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù),顯示 InputStream inputStream = socket.getInputStream(); //4、IO讀取 byte[] buf = new byte[1024]; int readline = 0; while ((readline = inputStream.read(buf)) != -1){ //根據(jù)讀取到的實(shí)際長度,顯示內(nèi)容 System.out.println(new String(buf, 0,readline)); } //5、獲取socket相關(guān)聯(lián)的輸出流 OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello,client".getBytes()); //設(shè)置結(jié)束標(biāo)記 socket.shutdownOutput(); //6、關(guān)閉流 inputStream.close(); socket.close(); serverSocket.close(); outputStream.close(); } }
? 客戶端:
public class SocketTCP02Client { public static void main(String[] args) throws IOException { //連接服務(wù)端(ip ,接口) //解析:連接本機(jī)的9999端口,如果連接成功,則返回Socket對象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客戶端 socket = " + socket.getClass()); //2、連接上后,生成Socket,通過 // 得到 和 socket對象相關(guān)聯(lián)的輸出流對象socket.getOutputStream() OutputStream outputStream = socket.getOutputStream(); //3、通過輸出流,寫入數(shù)據(jù)到 數(shù)據(jù)通道 outputStream.write("hello,server".getBytes()); //設(shè)置結(jié)束標(biāo)記 socket.shutdownOutput(); //4、獲取和socket相關(guān)聯(lián)的輸入流數(shù)據(jù),讀取數(shù)據(jù)(字節(jié)),并顯示 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int readline = 0; while ((readline = inputStream.read(buf)) != -1){ System.out.println(new String(buf, 0,readline)); } //5、關(guān)閉流對象和socket對象 outputStream.close(); socket.close(); inputStream.close(); System.out.println("客戶端退出....."); } }
3、應(yīng)用實(shí)例3(字符流)
? 服務(wù)端:
public class SocketTCP03Server { public static void main(String[] args) throws IOException { //1、在本機(jī)的9999端口監(jiān)聽,等待鏈接 // 細(xì)節(jié):要求本機(jī)沒有其他服務(wù)在監(jiān)聽9999端口 // 細(xì)節(jié):這個ServerSocket 可以通過accept 返回多個Socket[多個客戶端連接服務(wù)器的并發(fā)] ServerSocket serverSocket = new ServerSocket(9999); System.out.println("服務(wù)端在監(jiān)聽9999端口,等待連接......"); //2、當(dāng)沒有客戶端連接9999端口時,程序會阻塞,等待連接 // 如果有程序連接,則返回Socket對象,程序進(jìn)行執(zhí)行 Socket socket = serverSocket.accept(); System.out.println("服務(wù)端 socket = " + socket.getClass()); //3、通過 讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù),顯示 InputStream inputStream = socket.getInputStream(); //4、IO讀取,使用字符流 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s);//輸出 //5、獲取socket相關(guān)聯(lián)的輸出流 OutputStream outputStream = socket.getOutputStream(); //使用字符輸出流的方式恢復(fù)信息 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello,client 字符流"); bufferedWriter.newLine();//寫入換行符,表示恢復(fù)內(nèi)容結(jié)束 bufferedWriter.flush();//手動刷新 //設(shè)置結(jié)束標(biāo)記 socket.shutdownOutput(); //6、關(guān)閉流 bufferedReader.close(); bufferedWriter.close(); socket.close(); serverSocket.close(); } }
? 客戶端:
public class SocketTCP03Client { public static void main(String[] args) throws IOException { //連接服務(wù)端(ip ,接口) //解析:連接本機(jī)的9999端口,如果連接成功,則返回Socket對象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客戶端 socket = " + socket.getClass()); //2、連接上后,生成Socket,通過 // 得到 和 socket對象相關(guān)聯(lián)的輸出流對象socket.getOutputStream() OutputStream outputStream = socket.getOutputStream(); //3、通過輸出流,寫入數(shù)據(jù)到 數(shù)據(jù)通道,使用字符流 //outputStream.write("hello,server".getBytes()); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello,server 字符流"); bufferedWriter.newLine();//插入一個換行符,表示寫入的內(nèi)容結(jié)束,注意,要求對方使用readline(),結(jié)束標(biāo)識 bufferedWriter.flush();//如果使用字符流,需要手動刷新,否則數(shù)據(jù)不會寫入數(shù)據(jù)通道 //4、獲取和socket相關(guān)聯(lián)的輸入流數(shù)據(jù),讀取數(shù)據(jù)(字節(jié)),并顯示 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s); //5、關(guān)閉流對象和socket對象 bufferedReader.close(); socket.close(); bufferedWriter.close(); System.out.println("客戶端退出....."); } }
4、netstat 指令
? ? ? ? ? netstat -an 可以查看當(dāng)前主機(jī)網(wǎng)絡(luò)情況,包括端口監(jiān)聽情況和網(wǎng)絡(luò)連接情況
????????? netstat -an | more 可以分頁顯示要求在dos控制臺下執(zhí)行 win+r
?????????說明:
? ? ? ? ? ? (1)Listening 表示某個端口在監(jiān)聽
? ? ? ? ? ? (2)如果有一個外部程序(客戶端)連接到該端口,就會顯示一條連接信息
? ? ? ? ? ? (3) 可以輸入 ctrl + c 退出指令
三、UDP網(wǎng)絡(luò)通信編程?
1、基本介紹
????????? 類 DatagramSocket 和 DatagramPacket(數(shù)據(jù)包/數(shù)據(jù)報)實(shí)現(xiàn)了基于UDP協(xié)議網(wǎng)絡(luò)程序。
????????? UDP數(shù)據(jù)報通過數(shù)據(jù)報套接字DatagramSocket 發(fā)送和接收,系統(tǒng)不保證UDP 數(shù)據(jù)報一定能夠安全送到目的地,也不能確定什么時候可以抵達(dá)。????????? DatagramPacket 對象封裝了UDP數(shù)據(jù)報,在數(shù)據(jù)報中包含了發(fā)送端的IP地址和端口號以及接收端的IP地址和端口號。
????????? UDP議中每個數(shù)據(jù)報都給出了完整的地址信息,因此無須建立發(fā)送方和接收方的連接2、基本流程
????????? 核心的兩個類/對象 DatagramSocket 與 DatagramPacket
????????? 建立發(fā)送端,接收端(沒有服務(wù)端和客戶端概念)
????????? 發(fā)送數(shù)據(jù)前,建立數(shù)據(jù)包/報 DatagramPacket對象
????????? 調(diào)用DatagramSocket 的發(fā)送、接收方法
????????? 關(guān)閉DatagramSocket3、應(yīng)用實(shí)例
? 發(fā)送端:文章來源:http://www.zghlxwxcb.cn/news/detail-806484.html
public class UDPSenderB { public static void main(String[] args) throws IOException { //創(chuàng)建DatagramSocket 對象,準(zhǔn)備在9998端口 接收數(shù)據(jù) DatagramSocket socket = new DatagramSocket(9998); //2、將需要發(fā)送的數(shù)據(jù),封裝到DatagramPacket對象 byte[] data = "hello 明天吃火鍋".getBytes(); // 封裝的DatagramPacket 對象 data 內(nèi)容字節(jié)數(shù)組, data.length ,主機(jī)(IP),端口 DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 9999); socket.send(packet); //接收數(shù)據(jù) byte[] bytes = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length); System.out.println("等待接收數(shù)據(jù)..."); socket.receive(datagramPacket); int length = datagramPacket.getLength(); byte[] data1 = datagramPacket.getData(); String s = new String(data1 , 0 ,length); System.out.println(s); //關(guān)閉資源 socket.close(); System.out.println("B端退出..."); } }
? 接收端:文章來源地址http://www.zghlxwxcb.cn/news/detail-806484.html
public class UDPReceiverA { public static void main(String[] args) throws IOException { //1、創(chuàng)建一個DatagramSocket 對象,準(zhǔn)備在9999接收數(shù)據(jù) DatagramSocket socket = new DatagramSocket(9999); //2、構(gòu)建一個DatagramPacket 對象,準(zhǔn)備接收數(shù)據(jù) // UDP協(xié)議中,每個數(shù)據(jù)包只能是64k byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //3、調(diào)用接收方法,將通過網(wǎng)絡(luò)傳輸?shù)腄atagramPacket 對象,填充到packet 對象 // 當(dāng)有數(shù)據(jù)包發(fā)送到 本機(jī)的9999端口時,就會接收數(shù)據(jù),否則就會阻塞 System.out.println("接收端A 等待接收數(shù)據(jù)..."); socket.receive(packet); //4、可以把packet 進(jìn)行拆包,取出數(shù)據(jù),并顯示 int length = packet.getLength();//實(shí)際數(shù)據(jù)長度 byte[] data = packet.getData();//接收到的實(shí)際數(shù)據(jù) String s = new String(data, 0, length); System.out.println(s); //回復(fù)信息 byte[] bytes = "好的,明天見".getBytes(); DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9998); socket.send(datagramPacket); //關(guān)閉資源 socket.close(); System.out.println("A端退出.."); } }
到了這里,關(guān)于《Java SE》網(wǎng)絡(luò)編程基礎(chǔ)知識歸納。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!