前言
本文主要是為下一篇Websockt做鋪墊,大家了解socket的一些實現(xiàn)。
網(wǎng)絡(luò)編程三要素
網(wǎng)絡(luò)編程是指利用計算機網(wǎng)絡(luò)進行程序設(shè)計、開發(fā)的技術(shù)。網(wǎng)絡(luò)編程主要包含三個要素,分別是:
- IP地址和端口號
- 傳輸協(xié)議
- Socket
IP地址和端口號
在計算機網(wǎng)絡(luò)中,每臺計算機都有一個IP地址,用于唯一標識該計算機在網(wǎng)絡(luò)中的位置。IP地址由32位二進制數(shù)表示,通常采用點分十進制表示法,如192.168.1.1。
端口號是指計算機中應(yīng)用程序與網(wǎng)絡(luò)之間進行交互時,用于標識該應(yīng)用程序的一個標識符。端口號是一個16位的無符號整數(shù),取值范圍為0-65535,其中0-1023為系統(tǒng)保留端口號,一般用于系統(tǒng)服務(wù)。
傳輸協(xié)議
在互聯(lián)網(wǎng)中,主要有兩種傳輸協(xié)議,分別是TCP協(xié)議和UDP協(xié)議。
TCP協(xié)議是一種可靠的面向連接的傳輸協(xié)議。在TCP協(xié)議中,數(shù)據(jù)傳輸前需要先建立連接,通過三次握手進行確認,保證數(shù)據(jù)傳輸?shù)目煽啃?。TCP協(xié)議適用于對數(shù)據(jù)傳輸可靠性要求較高的應(yīng)用場合,如文件傳輸、電子郵件等。
UDP協(xié)議是一種不可靠的無連接傳輸協(xié)議。在UDP協(xié)議中,數(shù)據(jù)在傳輸過程中不需要建立連接,也不需要進行數(shù)據(jù)確認。UDP協(xié)議適用于對數(shù)據(jù)傳輸可靠性要求較低的應(yīng)用場合,如音視頻傳輸、在線游戲等。
Socket
Socket是一種通信協(xié)議,可以實現(xiàn)不同計算機之間的網(wǎng)絡(luò)通信。使用Socket開發(fā)網(wǎng)絡(luò)應(yīng)用程序,可以實現(xiàn)客戶端與服務(wù)器之間的數(shù)據(jù)交換,比如網(wǎng)頁數(shù)據(jù)、文件傳輸?shù)?。在Java中,可以使用Socket類實現(xiàn)TCP協(xié)議的Socket連接。客戶端通過創(chuàng)建Socket對象并指定服務(wù)端的IP地址和端口號來連接服務(wù)端。服務(wù)端通過創(chuàng)建ServerSocket對象并監(jiān)聽客戶端的請求,等待客戶端連接。
使用Scoket實現(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對象
//細節(jié):在創(chuàng)建對象的同時會連接服務(wù)端
// 如果連接不上,代碼會報錯
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)建對象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對象(DatagramSocket)
// DatagramSocket() 構(gòu)造數(shù)據(jù)報套接字并將其綁定到本地主機上的任何可用端口
DatagramSocket ds = new DatagramSocket();
//創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//構(gòu)造一個數(shù)據(jù)包,發(fā)送長度為 length的數(shù)據(jù)包到指定主機上的指定端口號。
byte[] bys = "hello,udp,我來了".getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);
//調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù)
//void send(DatagramPacket p) 從此套接字發(fā)送數(shù)據(jù)報包
ds.send(dp);
//關(guān)閉發(fā)送端
//void close() 關(guān)閉此數(shù)據(jù)報套接字
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對象(快遞公司)
//細節(jié):
//在接收的時候,一定要綁定端口
//而且綁定的端口一定要跟發(fā)送的端口保持一致
DatagramSocket ds = new DatagramSocket(10086);
//2.接收數(shù)據(jù)包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//該方法是阻塞的
//程序執(zhí)行到這一步的時候,會在這里死等
//等發(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 + "這臺電腦中的" + port + "這個端口發(fā)出的");
//4.釋放資源
ds.close();
}
}
結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-693829.html
總結(jié)
網(wǎng)絡(luò)編程是現(xiàn)代計算機技術(shù)中非常重要的一部分,上述三要素是網(wǎng)絡(luò)編程的基礎(chǔ)。要實現(xiàn)網(wǎng)絡(luò)編程,需要了解IP地址和端口號的概念和使用,掌握TCP協(xié)議和UDP協(xié)議的特點和使用,以及掌握Socket編程相關(guān)知識和技能。同時在實現(xiàn)過程中也需要注意安全性問題,例如加密數(shù)據(jù)傳輸、防止數(shù)據(jù)篡改等。文章來源地址http://www.zghlxwxcb.cn/news/detail-693829.html
維度 | TCP協(xié)議 | UDP協(xié)議 |
---|---|---|
傳輸可靠性 | 面向連接、可靠傳輸數(shù)據(jù) | 無連接、不可靠傳輸數(shù)據(jù) |
連接方式 | 三次握手連接方式 | 無連接方式 |
傳輸效率 | 傳輸效率較低 | 傳輸效率較高 |
數(shù)據(jù)包大小 | 數(shù)據(jù)包大小不固定 | 數(shù)據(jù)包大小固定 |
應(yīng)用場景 | 適用于對數(shù)據(jù)傳輸可靠性要求較高的應(yīng)用場合,如文件傳輸、電子郵件等 | 適用于對數(shù)據(jù)傳輸可靠性要求較低的應(yīng)用場合,如音視頻傳輸、在線游戲等 |
錯誤檢測 | 支持錯誤檢測和重傳機制 | 不支持錯誤檢測和重傳機制 |
擁塞控制 | 有擁塞控制機制,能夠避免網(wǎng)絡(luò)擁塞 | 沒有擁塞控制機制,可能導致網(wǎng)絡(luò)擁塞 |
數(shù)據(jù)順序 | 保證數(shù)據(jù)傳輸順序 | 不保證數(shù)據(jù)傳輸順序 |
連接數(shù)量 | 連接數(shù)量受限于系統(tǒng)內(nèi)存和處理器能力 | 連接數(shù)量受限于系統(tǒng)內(nèi)存和處理器能力 |
到了這里,關(guān)于Java網(wǎng)絡(luò)編程-Socket實現(xiàn)數(shù)據(jù)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!