18.網絡編程

網絡編程

又稱為Socket編程。

Java中網絡編程主要是以Java語言完成信息數據在網絡上的傳輸。

網絡

計算機網絡,指的是將不同地理位置的多臺計算機連接起來,可以實現信息共享和信息傳輸。

Java是Internet上的語言,提供了對網絡應用程序的支持,所以,我們使用Java開發一些常見的網絡應用。

網絡通信怎么完成?

1.通過網絡地址(IP地址)+端口 確定計算機以及具體的應用。

2.確定了計算機之后,完成傳輸(TCP/UDP)

Java實現網絡編程的要素

1.IP地址類:InetAddress

2.端口:int 值;

3.TCP/UDP操作相關類:Socket

IP地址 InetAddress:

32位二進制數值以點分的形式表示,分成4份

0.0.0.0 ~ 255.255.255.255

本地回環地址:127.0.0.1

本地主機名:localhost

package com.day18.socket;import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {//獲取InetAddress對象的方法,傳主機名,返回主機名和IP地址InetAddress address = InetAddress.getByName("localhost");System.out.println(address);//傳IP地址,返回的只有IP地址InetAddress address1 = InetAddress.getByName("127.0.0.1");System.out.println(address1);System.out.println(address.getHostName());//主機名System.out.println(address.getHostAddress());//主機地址//獲取本地主機實際的IP地址+主機名的InetAddress對象InetAddress address2 = InetAddress.getLocalHost();System.out.println(address2);//傳入網站的信息,獲取對象InetAddress address3 = InetAddress.getByName("www.baidu.com");System.out.println(address3);}
}

端口號

端口號是確定應用的唯一標識,端口號是一個16位的整數,

范圍是0-65535,TCP和UDP各有65535個端口,單個協議下的端口號不能沖突。

公認端口:0-1023 被預先定義的服務占用端口

http:80

https:443

注冊端口:

tomcat:8080

mysql:3366

oracle:1521

查看端口是否被占用:netstat-ano

InetSocketAddress 該類實現IP套接字地址(IP地址+端口號)

InetSocketAddress(InetAddress addr, int port)

從IP地址和端口號創建套接字地址。

Socket 該類實現客戶端套接字(也稱為“套接字”)。

Socket(InetAddress address, int port)

創建流套接字并將其連接到指定IP地址的指定端口號。

ServerSocket 這個類實現了服務器套接字

ServerSocket(int port)

創建綁定到指定端口的服務器套接字。

網絡傳輸的協議

滿足IP地址+端口的使用后,需要選定一個傳輸方式,來實現數據的傳輸

傳輸協議都定義在傳輸層,分為TCP協議和UDP協議

TCP協議:

使用之前,先要建立TCP連接,形成傳輸通道,采用3次握手,點對點的通信,是一種安全的傳輸協議。

TCP通信中,必須要有的應用進程:客戶端、服務端

TCP協議可以傳送大量的數據,傳輸完畢,需要釋放連接,效率比較低。

UDP協議:

將數據、源地址、目標地址封裝在數據包中,直接將數據包發送就行,

發送的時候,不需要建立連接,也不會去管對方是否能收到數據,接收方如果接受到了,也不會做出回應

是一種不安全的傳輸協議。

每個數據大小限制在64kb以內,發送完不需要是否,開銷小、速度快。

分別使用TCP和UDP實現信息傳輸

TCP實現消息發送

客戶端發送消息到服務端,服務端接收到數據把數據顯示在控制臺

package com.day18.tcp1;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) {try {//實現步驟//1.連接服務器的Socket//創建SocketInetAddress address = InetAddress.getByName("127.0.0.1");int port=8999;Socket socket = new Socket(address, port);//2.發送消息//通過socket,獲取輸出流對象,向服務器寫內容OutputStream os = socket.getOutputStream();os.write("你好,我現在在使用TCP編程發送消息".getBytes());//3.關閉資源os.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
package com.day18.tcp1;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) {try {//1.建立服務端ServerSocketServerSocket serverSocket = new ServerSocket(8999);//等待用戶連接while (true){//調用accept()方法,偵聽到連接此服務器的Socket并返回Socket accept = serverSocket.accept();//通過返回的socket對象獲取輸入流InputStream is = accept.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();int len;byte[] bytes = new byte[1024];//3.接受用戶消息,讀取消息while ((len = is.read(bytes)) != -1){baos.write(bytes,0,len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();}}
}
UDP 實現消息發送

使用的類:

DatagramPacket 該類表示數據報包。

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

構造用于發送長度的分組的數據報包 length指定主機上到指定的端口號。

DatagramSocket 此類表示用于發送和接收數據報數據包的套接字。

DatagramSocket(int port)

構造數據報套接字并將其綁定到本地主機上的指定端口。

package com.day18.udp1;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//發送方
public class UDPClient {public static void main(String[] args) throws IOException {//創建數據報包對象//定義數據String data = "你好,我在使用UDP編程發送數據";byte[] bytes = data.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port=9999;DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length, address, port);//創建DatagramSocket對象DatagramSocket socket = new DatagramSocket();//發送數據socket.send(packet);System.out.println("數據發送完畢");socket.close();}
}
package com.day18.udp1;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;//接收方
public class UDPServer {public static void main(String[] args) throws IOException {//創建DatagramSocket對象,接收對象DatagramSocket socket = new DatagramSocket(9999);//創建一個數據包對象,用來接收數據byte[] bytes = new byte[1024];DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);//接收數據放入到數據包中socket.receive(packet);//從數據包中拿去數據,拿出來是字節數組byte[] data = packet.getData();//字節數組轉字符串String s = new String(data, 0, data.length);System.out.println(s.trim());}
}
UDP+多線程實現聊天
package com.day18.udp2;import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;//發送方
public class TalkSend implements Runnable{//創建需要的對象private DatagramSocket socket;private String toIP;//目標IP地址private int toPort;//目標端口private int fromPort;//來自端口//    private BufferedReader reader;Scanner scanner = new Scanner(System.in);public TalkSend(String toIP, int toPort, int fromPort) {this.toIP = toIP;this.toPort = toPort;this.fromPort = fromPort;try {//創建對象的同時,把socket賦值socket = new DatagramSocket(fromPort);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//讀取輸入信息String s = scanner.next();byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName(toIP);//將寫入的數據,封裝到數據包中DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length, address, toPort);//發送socket.send(packet);//如果不準備聊天了,發送bye作為結束if ("bye".equals(s)){break;}}} catch (IOException e) {e.printStackTrace();}socket.close();}
}
package com.day18.udp2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceive implements Runnable{private DatagramSocket socket;private String messageFrom;private int port;public TalkReceive(String messageFrom, int port) {this.messageFrom = messageFrom;this.port = port;//開發端口號,創建DatagramSocket對象try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//接收消息byte[] bytes = new byte[1024];DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length);//接收數據,存入packetsocket.receive(packet);//把數據輸出byte[] data = packet.getData();String s = new String(data,0,data.length);System.out.println(messageFrom+":"+s.trim());//退出判斷,如果發過來的數據是bye,則結束循環if ("bye".equals(s)){break;}}} catch (IOException e) {e.printStackTrace();}socket.close();}
}
package com.day18.udp2;
//小紅發給小明
public class TalkTest1 {public static void main(String[] args) {new Thread(new TalkSend("localhost", 9999, 7777)).start();new Thread(new TalkReceive("小明", 8888)).start();}
}
package com.day18.udp2;
//小明發給小紅
public class TalkTest2 {public static void main(String[] args) {new Thread(new TalkSend("localhost", 8888, 6666)).start();new Thread(new TalkReceive("小紅", 9999)).start();}
}
使用 TCP 完成圖片上傳
package com.day18.tcp2;import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;//圖片上傳的客戶端
public class ClientDemo {public static void main(String[] args) throws Exception {//創建Socket對象Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);//獲取輸出流OutputStream os = socket.getOutputStream();//把文件讀進內存,輸出流將文件寫出FileInputStream fis = new FileInputStream("D://hello//java//No1.jpg");byte[] bytes = new byte[1024];int len;while ((len = fis.read(bytes) )!= -1){os.write(bytes,0,len);}//需要調用方法將之前的上傳操作結束socket.shutdownOutput();//拿到服務端返回的消息,通過socket對象,獲取輸入流InputStream is = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();int len1;byte[] bytes1 = new byte[1024];//接受用戶消息,讀取消息while ((len1 = is.read(bytes1)) != -1){baos.write(bytes1,0,len1);}System.out.println(baos.toString());fis.close();os.close();socket.close();}
}
package com.day18.tcp2;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 ServerDemo {public static void main(String[] args) throws IOException {//創建ServerSocketServerSocket serverSocket = new ServerSocket(9090);//等待客戶端連接,獲取客戶端的socketSocket accept = serverSocket.accept();//獲取socket中的輸入流InputStream is = accept.getInputStream();//拿到輸入流中的內容,再把內容寫入服務器中FileOutputStream fos = new FileOutputStream("receive.jpg");byte[] bytes = new byte[1024];int len;//讀內容,讀的同時往socket中的輸出流寫內容while ((len = is.read(bytes) )!= -1){fos.write(bytes,0,len);}//把圖片上傳成功的信息返回給客戶端OutputStream os = accept.getOutputStream();os.write("圖片上傳成功".getBytes());is.close();fos.close();os.close();accept.close();serverSocket.close();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14339.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

筆記 | 《css權威指南》

網絡安全色 URL text-indent line-height & vertical-align 字體 font-weight 400 normal 700 bold background-attachment

SpringBoot項目集成JetCache緩存框架步驟

JetCache是阿里開源的基于java開發的緩存框架&#xff0c;支持多種緩存類型&#xff1a;本地緩存、分布式緩存、多級緩存。能夠滿足不同業務場景的緩存需求。 1.導入依賴 <!--jetcache緩存 --> <dependency><groupId>com.alicp.jetcache</groupId>&l…

【調試筆記-20240516-Windows-使用VS2019編譯edk2(上)】

調試筆記-系列文章目錄 調試筆記-20240516-Windows-使用VS2019編譯edk2&#xff08;上&#xff09; 文章目錄 調試筆記-系列文章目錄調試筆記-20240516-Windows-使用VS2019編譯edk2&#xff08;上&#xff09; 前言一、安裝開發工具1. 安裝 VS20192. 安裝 Python 3.103. 安裝 …

pdf加水印怎么加?3種添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不僅是為了保護文檔內容&#xff0c;確保信息的安全性和完整性&#xff0c;更是一種有效的版權保護措施。通過添加水印&#xff0c;您可以在文檔中嵌入公司名稱、日期、編號等信息&#xff0c;以明確文檔的歸屬權和使用限制。此外&#xf…

小而美:兩步完成從源碼到應用的極簡交付

作者&#xff1a;花三&#xff08;王俊&#xff09; Serverless 應用引擎 SAE 是阿里云推出的一款零代碼改造、極簡易用、自適應彈性的容器化應用托管平臺&#xff0c;面市以來為幾萬家企業客戶提供服務&#xff0c;運行穩定&#xff0c;廣受好評。 SAE 的出現解決了眾多企業…

Python庫之lxml的簡介、安裝、使用方法詳細攻略

Python庫之lxml的簡介、安裝、使用方法詳細攻略 簡介 lxml是一個用于處理XML和HTML文檔的Python庫&#xff0c;它提供了簡單易用的API來解析和生成這些文檔。lxml以其性能和易用性而受到廣泛歡迎&#xff0c;特別適合于需要處理大量數據或需要高性能解析的場景。 安裝 安裝…

運行時異常和編譯時異常的區別

Java中的異常被分為兩大類&#xff1a;編譯時異常和運行時異常。 都是RuntimeException類及其子類異常&#xff0c;如NullPointerException、IndexOutOfBoundsException。這些異常是不檢查異常&#xff0c;運行時異常的特點是Java編譯器不會檢查它&#xff0c;程序中可以選擇捕…

純代碼如何實現WordPress搜索包含評論內容?

WordPress自帶的搜索默認情況下是不包含評論內容的&#xff0c;不過有些WordPress網站評論內容比較多&#xff0c;而且也比較有用&#xff0c;所以想要讓用戶在搜索時也能夠同時搜索到評論內容&#xff0c;那么應該怎么做呢&#xff1f; 網絡上很多教程都是推薦安裝SearchWP插…

RK3588 Android13 預安裝自己的apk應用及把這個應用設置為默認桌面

1、cp -rf device/rockchip/rk3588/rk3588m_s/preinstall device/rockchip/rk3588/rk3588_t/ 2、給device/rockchip/rk3588/rk3588_t/preinstall/的存放app的文件夾改名為app-imms2&#xff0c;在app-imms2放入app-imms2.apk,編譯安卓源碼即可&#xff0c; 3、編譯完會在out/…

android sp指針的cast

sp<Base> b; sp<Derived> d; b static_cast<Base*>(d.get()); 對于c原生的智能指針&#xff0c;有static_pointer_cast之類的操作方法。可以看cppreference。

Spring Web MVC介紹及詳細教程

目錄 1.什么是Spring Web MVC&#xff1f; 1.1 MVC定義 1.2 Spring MVC與MVC關系 2.為什么要學習Spring MVC 3.項目創建 4.Spring MVC連接 4.1 RequestMapping 4.2 PostMapping和GetMapping 5.Spring MVC參數獲取 5.1 獲取單個參數 5.2 獲取多個參數 5.3 獲取普通對…

通用代碼生成器應用場景一,項目前期

通用代碼生成器是一種自動化編程軟件&#xff0c;是一種先進的編譯系統。它具有表級抽象。把系統抽象為域對象&#xff0c;枚舉&#xff0c;彈性登錄模塊&#xff0c;復雜版面和圖形報表。使用通用代碼生成器完成項目前期&#xff0c;比直接使用對應的高級語言快的多&#xff0…

element Notification 消息過多需要折疊

Notification 消息過多太長 希望能折疊 如圖下效果 element-plus 可以將dom 插入到具體的元素 結合css :nth-child 來控制樣式達到效果 element dom 只能插入到body中 所以無法使用:nth-child 1.Notification需要消息提示時設置class let eleNum 0 // 彈窗的序號 function…

vue+canvas實現逐字手寫效果

在pc端進行逐字手寫的功能。用戶可以在一個 inputCanvas 上書寫單個字&#xff0c;然后在特定時間后將這個字添加到 outputCanvas 上&#xff0c;形成一個逐字的手寫效果。用戶還可以保存整幅圖像或者撤銷上一個添加的字。 <template><div class"container"…

小紅書-社區搜索部 (NLP、CV算法實習生) 一面面經

&#x1f604; 整個流程按如下問題展開&#xff0c;用時60min左右面試官人挺好&#xff0c;前半部分問問題&#xff0c;后半部分coding一道題。 各位有什么問題可以直接評論區留言&#xff0c;24小時內必回信息&#xff0c;放心~ 文章目錄 1、自我介紹2、介紹下項目&#xff…

金額計算導致的錯誤問題匯總解決

在日常的開發中&#xff0c;前端計算金額是非常常見&#xff0c;如果不夠仔細&#xff0c;考慮不夠周全的話&#xff0c;很容易犯錯的&#xff0c;金額這個東西一但錯了是很嚴重的&#xff0c;因此總結一些常見的錯誤&#xff1a; 1.最重要的&#xff0c;涉及到計算的參數一定要…

關于做事方式的小討論

大家好&#xff0c;我是阿趙。 ??之前五一勞動節期間&#xff0c;看到了這么一個新聞&#xff1a;某動物園內部收費項目五一期間漲價&#xff0c;喂長頸鹿的樹葉&#xff0c;一枝需要30元。然后新聞下面的評論就炸鍋了&#xff0c;紛紛的指責動物園太黑心&#xff0c;一枝樹葉…

淄博公司商標駁回復審條件及流程

商標是人工審查的&#xff0c;所以不同的人會有不同的想法和意見&#xff0c;導致同一案件的審查結果不同。特別是商標審查周期縮短到5個月&#xff0c;全國平均每個工作日有1萬多個商標提交申請&#xff0c;而全國只有一個商標審查單位——國家商標局提交申請。這種情況下&…

從入門到精通:掌握Scrapy框架的關鍵技巧

在當今信息爆炸的時代&#xff0c;獲取并利用網絡數據成為了許多行業的核心競爭力之一。而作為一名數據分析師、網絡研究者或者是信息工作者&#xff0c;要想獲取網絡上的大量數據&#xff0c;離不開網絡爬蟲工具的幫助。而Scrapy框架作為Python語言中最為強大的網絡爬蟲框架之…

ubuntu當前登錄用戶IP驗證

設置一個白名單列表檢查到登錄用戶IP信息不在白名單&#xff0c;發送信息到指定郵箱 #!/bin/bash# 定義常用IP地址列表文件 KNOWN_IP_FILE"/path/to/known_ips.txt" # 替換為實際路徑# 定義郵件接收者 EMAIL_TO"test163.com"# 定義日志文件 LOG_FILE&quo…