Java中Socket實(shí)現(xiàn)數(shù)據(jù)通信的示例代碼
前言
本文主要是為下一篇Websockt做鋪墊,大家了解socket的一些實(shí)現(xiàn)。
網(wǎng)絡(luò)編程三要素
網(wǎng)絡(luò)編程是指利用計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行程序設(shè)計(jì)、開發(fā)的技術(shù)。網(wǎng)絡(luò)編程主要包含三個(gè)要素,分別是:
- IP地址和端口號(hào)
- 傳輸協(xié)議
- Socket
IP地址和端口號(hào)
在計(jì)算機(jī)網(wǎng)絡(luò)中,每臺(tái)計(jì)算機(jī)都有一個(gè)IP地址,用于唯一標(biāo)識(shí)該計(jì)算機(jī)在網(wǎng)絡(luò)中的位置。IP地址由32位二進(jìn)制數(shù)表示,通常采用點(diǎn)分十進(jìn)制表示法,如192.168.1.1。
端口號(hào)是指計(jì)算機(jī)中應(yīng)用程序與網(wǎng)絡(luò)之間進(jìn)行交互時(shí),用于標(biāo)識(shí)該應(yīng)用程序的一個(gè)標(biāo)識(shí)符。端口號(hào)是一個(gè)16位的無符號(hào)整數(shù),取值范圍為0-65535,其中0-1023為系統(tǒng)保留端口號(hào),一般用于系統(tǒng)服務(wù)。
傳輸協(xié)議
在互聯(lián)網(wǎng)中,主要有兩種傳輸協(xié)議,分別是TCP協(xié)議和UDP協(xié)議。
TCP協(xié)議是一種可靠的面向連接的傳輸協(xié)議。在TCP協(xié)議中,數(shù)據(jù)傳輸前需要先建立連接,通過三次握手進(jìn)行確認(rèn),保證數(shù)據(jù)傳輸?shù)目煽啃?。TCP協(xié)議適用于對(duì)數(shù)據(jù)傳輸可靠性要求較高的應(yīng)用場(chǎng)合,如文件傳輸、電子郵件等。
UDP協(xié)議是一種不可靠的無連接傳輸協(xié)議。在UDP協(xié)議中,數(shù)據(jù)在傳輸過程中不需要建立連接,也不需要進(jìn)行數(shù)據(jù)確認(rèn)。UDP協(xié)議適用于對(duì)數(shù)據(jù)傳輸可靠性要求較低的應(yīng)用場(chǎng)合,如音視頻傳輸、在線游戲等。
Socket
Socket是一種通信協(xié)議,可以實(shí)現(xiàn)不同計(jì)算機(jī)之間的網(wǎng)絡(luò)通信。使用Socket開發(fā)網(wǎng)絡(luò)應(yīng)用程序,可以實(shí)現(xiàn)客戶端與服務(wù)器之間的數(shù)據(jù)交換,比如網(wǎng)頁數(shù)據(jù)、文件傳輸?shù)?。在Java中,可以使用Socket類實(shí)現(xiàn)TCP協(xié)議的Socket連接??蛻舳送ㄟ^創(chuàng)建Socket對(duì)象并指定服務(wù)端的IP地址和端口號(hào)來連接服務(wù)端。服務(wù)端通過創(chuàng)建ServerSocket對(duì)象并監(jiān)聽客戶端的請(qǐng)求,等待客戶端連接。
使用Scoket實(shí)現(xiàn)網(wǎng)絡(luò)通信
TCP
TCP通信-發(fā)送方
public class Client { public static void main(String[] args) throws IOException { //TCP協(xié)議,發(fā)送數(shù)據(jù) //1.創(chuàng)建Socket對(duì)象 //細(xì)節(jié):在創(chuàng)建對(duì)象的同時(shí)會(huì)連接服務(wù)端 // 如果連接不上,代碼會(huì)報(bào)錯(cuò) Socket socket = new Socket("127.0.0.1",10000); //2.可以從連接通道中獲取輸出流 OutputStream os = socket.getOutputStream(); //寫出數(shù)據(jù) os.write("aaa".getBytes()); //3.釋放資源 os.close(); socket.close(); } }
TCP通信-接收方
public class Server { public static void main(String[] args) throws IOException { //TCP協(xié)議,接收數(shù)據(jù) //1.創(chuàng)建對(duì)象ServerSocker ServerSocket ss = new ServerSocket(10000); //2.監(jiān)聽客戶端的鏈接 Socket socket = ss.accept(); //3.從連接通道中獲取輸入流讀取數(shù)據(jù) InputStream is = socket.getInputStream(); int b; while ((b = is.read()) != -1){ System.out.println((char) b); } //4.釋放資源 socket.close(); ss.close(); } }
結(jié)果
UDP
UDP通信-發(fā)送方
package com.utils; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @BelongsProject: CSDN_score * @BelongsPackage: com.utils * @Author:qiutianshuo * @Description: * @CreateTime: 2023-09-01 11:24 * @Version: 1.0 */ public class SendDemo { public static void main(String[] args) throws IOException { //創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket) // DatagramSocket() 構(gòu)造數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的任何可用端口 DatagramSocket ds = new DatagramSocket(); //創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包 //DatagramPacket(byte[] buf, int length, InetAddress address, int port) //構(gòu)造一個(gè)數(shù)據(jù)包,發(fā)送長(zhǎng)度為 length的數(shù)據(jù)包到指定主機(jī)上的指定端口號(hào)。 byte[] bys = "hello,udp,我來了".getBytes(); DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086); //調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù) //void send(DatagramPacket p) 從此套接字發(fā)送數(shù)據(jù)報(bào)包 ds.send(dp); //關(guān)閉發(fā)送端 //void close() 關(guān)閉此數(shù)據(jù)報(bào)套接字 ds.close(); } }
UDP通信-接收方
package com.utils; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class ReceiveMessageDemo { public static void main(String[] args) throws IOException { //接收數(shù)據(jù) //1.創(chuàng)建DatagramSocket對(duì)象(快遞公司) //細(xì)節(jié): //在接收的時(shí)候,一定要綁定端口 //而且綁定的端口一定要跟發(fā)送的端口保持一致 DatagramSocket ds = new DatagramSocket(10086); //2.接收數(shù)據(jù)包 byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes,bytes.length); //該方法是阻塞的 //程序執(zhí)行到這一步的時(shí)候,會(huì)在這里死等 //等發(fā)送端發(fā)送消息 System.out.println(11111); ds.receive(dp); System.out.println(2222); //3.解析數(shù)據(jù)包 byte[] data = dp.getData(); int len = dp.getLength(); InetAddress address = dp.getAddress(); int port = dp.getPort(); System.out.println("接收到數(shù)據(jù)" + new String(data,0,len)); System.out.println("該數(shù)據(jù)是從" + address + "這臺(tái)電腦中的" + port + "這個(gè)端口發(fā)出的"); //4.釋放資源 ds.close(); } }
結(jié)果
總結(jié)
網(wǎng)絡(luò)編程是現(xiàn)代計(jì)算機(jī)技術(shù)中非常重要的一部分,上述三要素是網(wǎng)絡(luò)編程的基礎(chǔ)。要實(shí)現(xiàn)網(wǎng)絡(luò)編程,需要了解IP地址和端口號(hào)的概念和使用,掌握TCP協(xié)議和UDP協(xié)議的特點(diǎn)和使用,以及掌握Socket編程相關(guān)知識(shí)和技能。同時(shí)在實(shí)現(xiàn)過程中也需要注意安全性問題,例如加密數(shù)據(jù)傳輸、防止數(shù)據(jù)篡改等。
維度 | TCP協(xié)議 | UDP協(xié)議 |
---|---|---|
傳輸可靠性 | 面向連接、可靠傳輸數(shù)據(jù) | 無連接、不可靠傳輸數(shù)據(jù) |
連接方式 | 三次握手連接方式 | 無連接方式 |
傳輸效率 | 傳輸效率較低 | 傳輸效率較高 |
數(shù)據(jù)包大小 | 數(shù)據(jù)包大小不固定 | 數(shù)據(jù)包大小固定 |
應(yīng)用場(chǎng)景 | 適用于對(duì)數(shù)據(jù)傳輸可靠性要求較高的應(yīng)用場(chǎng)合,如文件傳輸、電子郵件等 | 適用于對(duì)數(shù)據(jù)傳輸可靠性要求較低的應(yīng)用場(chǎng)合,如音視頻傳輸、在線游戲等 |
錯(cuò)誤檢測(cè) | 支持錯(cuò)誤檢測(cè)和重傳機(jī)制 | 不支持錯(cuò)誤檢測(cè)和重傳機(jī)制 |
擁塞控制 | 有擁塞控制機(jī)制,能夠避免網(wǎng)絡(luò)擁塞 | 沒有擁塞控制機(jī)制,可能導(dǎo)致網(wǎng)絡(luò)擁塞 |
數(shù)據(jù)順序 | 保證數(shù)據(jù)傳輸順序 | 不保證數(shù)據(jù)傳輸順序 |
連接數(shù)量 | 連接數(shù)量受限于系統(tǒng)內(nèi)存和處理器能力 | 連接數(shù)量受限于系統(tǒng)內(nèi)存和處理器能力 |
到此這篇關(guān)于Java中Socket實(shí)現(xiàn)數(shù)據(jù)通信的示例代碼的文章就介紹到這了,更多相關(guān)Java Socket數(shù)據(jù)通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例詳解
這篇文章主要介紹了Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例,較為詳細(xì)的分析了抽象工廠模式的定義、原理并結(jié)合實(shí)例形式分析了Java使用抽象工廠模式實(shí)現(xiàn)肯德基消費(fèi)案例的步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-05-05基于Spring5實(shí)現(xiàn)登錄注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了基于Spring5實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Java thread.isInterrupted() 返回值不確定結(jié)果分析解決
這篇文章主要介紹了Java thread.isInterrupted() 返回值不確定結(jié)果分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析
這篇文章主要介紹了Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析,本文的主要內(nèi)容就在于要理解volatile的緩存的一致性協(xié)議導(dǎo)致的共享變量可見性,以及volatile在解析成為匯編語言的時(shí)候?qū)ψ兞考渔i兩塊理論內(nèi)容,需要的朋友可以參考下2024-01-01