網絡協議:一文搞懂Socket套接字

本篇內容包括:Socket 套接字的簡介、Socket 套接字的分類、Java 中的 Socket 即 java.net.ServerSocketjava.net.Socket 的使用,以及Java 使用套接字 Scoket 編程的Demo。

一、Socket 簡介

TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的通信協議,數據在傳輸前要建立連接,傳輸完畢后還要斷開連接。TCP 協議提供的是點對點的通信,每條 TCP 連接由兩端的套接字唯一確定。可以理解為 TCP 連接兩端的套接字來連起來就形成了管道,管道的兩端或者說管道的端口就是 Socket 套接字。

Socket 的原意是“插座”,在計算機通信領域,Socket 被翻譯為“套接字”,它是計算機之間進行通信的一種約定或一種方式。通過 socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。

在這里插入圖片描述

Socket 的典型應用就是 Web 服務器和瀏覽器:瀏覽器獲取用戶輸入的 URL,向服務器發起請求,服務器分析接收到的 URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。


二、Socket 分類

TCP/IP 協議族提供三種常見的 Socket 類型:流式 Socket(SOCK_STREAM)流式套接字、數據報 Socket(SOCK_DGRAM)數據報套接字、原始 Socket(SOCK_RAW)原始套接字。

1、流式套接字(SOCK_STREAM)

用于提供面向連接、可靠的數據傳輸服務。該服務將保證數據能夠實現無差錯、無重復發送,并按順序接收。流套接字之所以能夠實現可靠 的數據服務,原因在于其使用了傳輸控制協議 TCP。 這類套接字中,傳輸數據之前必須在兩個應用進程之間建立一條通信連接, 這就確保了參與通信的兩個應甩進程都是活動并具響應的e當連接建立之卮應用進程只要通過套接字向 TCP 層發送數據流,而另一個應用進程便可以接收到相應的數據流,它們不需要知道傳輸層是如何對數據流進行處理。特別責要注意的是通信連接必須顯式建文。該套接字類型適食傳輸大量的數據,但不支持廣播和多播方式。

2、數據報套接字(SOCK_DGRAM)

提供了一種無連接的服務,通信雙方不需要建立任何顯式連接,數據可以發送到指定的套接字,并且可以從指定的套接字接收數據。該服務并不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。數據報套接字使用UDP進行數據的傳輸。由于數據包套接字不能保證數據傳輸的可靠性,對于有可能出現的數據丟失情況,需要在程序中做相應的處理。與數據報套接字相比,使用流式套接字是一個更為可靠的方法,但對于某些應用,建立一個顯式連接所導致的系統開銷是令人難以接收的,并且數據報套接字支持廣播和多播方式。

3、原始套接字(SOCK_RAW)

與標準套接字(標準套接字指的是前面介紹的流套接字和數據報套接字)的區別在于:原始套接字可以讀寫內核沒有處理的 IP 數據包,而流套接字只能讀取 TCP 的數據,數據報套接字只能讀取 UDP 的數據。使用原始套接字的主要目的是為了避開 TCP/IP 處理機制,被傳送的數據包可以被直接傳送給需要它的應用程序。因此,其主要是在編寫自定義底層協議的應用程序時使用,例如各種不同的 TCP/IP 實用程序

三、Java 中的 Socket

Java 中對 Socket 的使用是基于兩個類 java.net.ServerSocketjava.net.Socket

img

1、java.net.Socket 構造方法

//不含參構造方法
Socket();
// 創建一個流套接字并將其連接到指定 IP 地址的指定端口號。
Socket(InetAddress address, int port)
// 創建一個流套接字并將其連接到指定主機上的指定端口號
Socket(String host, int port)
// 創建一個套接字并將其連接到指定遠程地址上的指定遠程端口
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
// 創建一個套接字并將其連接到指定遠程主機上的指定遠程端口
Socket(String host, int port, InetAddress localAddr, int localPort)

2、java.net.Socket 常用方法

// 將此套接字連接到服務器
connect(SocketAddress endpoint)
// 將此套接字連接到服務器,并指定一個超時值
connect(SocketAddress endpoint, int timeout)// 返回服務端的ip地址
getInetAddress();
// 獲取服務端的端口號
getPort();
// 獲取本地客戶端的ip地址
getLocalAddress();
// 獲取本地客戶端的端口號
getLocalPort();
// 返回此套接字的輸入流
getInputStream()
// 返回此套接字的輸出流
getOutputStream()// 根據連接是否關閉返回一個boolean值,關閉則返回true,否則返回false
isClose();
// 如果連接是否曾被連接過則返回true,否則返回false
isConnect();
// 如果Socket已經與本地的一個端口綁定,返回true,否則返回false
isBound();// 關閉輸入流
shutdownInput();
// 關閉輸出流
shutdownOutput();// 關閉Socket
close();

3、java.net.ServerSocket 構造方法

// 創建綁定到特定端口的服務器套接字
ServerSocket(int port)

4、java.net.ServerSocket 常用方法

// 偵聽并接受到此套接字的連接。
accept()
// 返回此服務器套接字的本地地址
getInetAddress()

四、Java Socket Demo

Demo:編程實現基于 TCP 的 Socket 服務器端和客戶端的通信

1、Demo 服務端

服務端的 Socket Demo 流程思路:

  1. 創建 ServerSocket 對象,綁定監聽端口;
  2. 通過 accept() 方法監聽客戶端請求;
  3. 鏈接建立后,通過輸入流讀取客戶端發送的請求信息;
  4. 通過輸出流向客戶端發送響應信息;
  5. 關閉相關資源。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;/** 基于TCP協議的Socket通信,實現用戶登錄* 服務器端*/
public class Server {public static void main(String[] args) {try {// 1、創建一個服務器Socket,即ServerSocket,指定綁定的端口,并監聽此端口ServerSocket serverSocket = new ServerSocket(8888);// 2、調用()方法開始監聽,等待客戶端的連接System.out.println("服務器即將啟動,等待客戶端的連接");Socket socket = serverSocket.accept();// 就會處于阻塞的狀態,等待監聽// 3、獲取輸入流,病讀取客戶端信息InputStream is = socket.getInputStream();// 字節輸入流// 將字節流轉換為字符流InputStreamReader isr = new InputStreamReader(is);// 為輸入流添加緩沖BufferedReader br = new BufferedReader(isr);String info = null;while((info = br.readLine())!=null){System.out.println("我是服務器,讀取客戶端發過來的信息:"+info);}socket.shutdownInput();//關閉輸入流// 關閉資源br.close();isr.close();is.close();socket.close();serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

2、Demo 客戶端

客戶端的 Socket Demo 流程思路:

  1. 創建 Socket對象,指明需要連接的服務器的地址和端口號;

  2. 連接建立后,通過輸出流向服務器端發送請求信息;

  3. 通過輸入流獲取服務器響應的信息;

  4. 關閉相關資源。

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;/** 客戶端*/
public class Client {public static void main(String[] args) {// 1、創建客戶端Socket,指定服務器地址和端口try {Socket  socket = new Socket("localhost", 8888);// 2、獲取輸出流,向服務器端發送信息OutputStream os = socket.getOutputStream();// 獲取字節輸出流// 將輸出流包裝為打印流PrintWriter pw = new PrintWriter(os);pw.write("用戶名:user 密碼:pawd");pw.flush();socket.shutdownInput();//關閉輸出流// 3、關閉資源pw.close();os.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

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

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

相關文章

RESETLOGS

使用resetlogs選項,會把當前的日志序號(log sequence number)重設為1,并拋棄所有日志信息。在以下條件時需要使用resetlogs選項: 在不完全恢復(介質恢復); 使用備份控制文件。 使…

網絡協議:透徹解析HTTP協議

本篇內容包括:HTTP 協議定義及其特點概述、關于 URL 定義及分類概述、Request 請求、Response 響應 以及 瀏覽器訪問一個網站的全過程 等內容… 一、HTTP 協議概述 HTTP(HyperText Transfer Protocol) 即 超文本傳輸協議,它是一種…

oracle參數文件和口令文件

外部 審核 口令:記錄超級用戶的用戶名和口令,做sys用戶的安全審核 oracle9以后全部使用sys登錄,但需要使用as sysdba ,之前版本需要使用internal o7字典打開 只要用戶和密碼存在于口令文件,就可以以sysdba登錄&#…

innobackup備份恢復實操步驟--gtid復制(1)(1)

首先在主庫進行備份: 備份命令: Innobackupex --defaults-file/app/dbcluster/sgrdb/mysql/my19103.cnf --no-timestamp --userdbscale --passwordS6000dbscale --host10.157.43.224 --port19103 /data/backup 如果使用setsid: setsid …

Redis系列:Redis的概述與安裝

Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對數據庫。 本篇內容包括:Redis 簡介(為什么快?為什么單線程?優…

安裝LibreOffice和字體

#/bin/bash # Check if user is root if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root"exit 1 fi echo 安裝LibreOffice cd /home/ tar -zxvf LibreOffice_6.3.3_Linux_x86-64_rpm.tar.gz cd /home/LibreO…

xtrabackup備份腳本

#!/bin/sh #備份主機 remote_ip100.0.132.160 Master_ip100.20.132.158 VIP100.20.132.166 #備份用戶 userroot #密碼 password00000 # 返回年月日 backup_datedate %F # 返回時分秒 backup_timedate %H-%M-%S # 返回今天是這周的第幾天 backup_week_daydate %u backup_ok0 #備…

Redis系列:使用Redis實現分布式鎖及相關問題

分布式鎖其實就是,控制分布式系統不同進程共同訪問共享資源的一種鎖的實現。如果不同的系統或同一個系統的不同主機之間共享了某個臨界資源,往往需要互斥來防止彼此干擾,以保證一致性。 本篇內容包括:關于 Redis 與 分布式鎖&…

Redis系列:Redis持久化機制與Redis事務

Redis 是個基于內存的數據庫。那服務一旦宕機,內存中數據必將全部丟失。所以丟失數據的恢復對于 Redis 是十分重要的,我們首先想到是可以從數據庫中恢復,但是在由 Redis 宕機時(說明相關工作正在運行)且數據量很大情況…

Java基礎:Java程序設計環境

按應用范圍,Java 可分為 3 個體系,即 Java SE、Java EE 和 Java ME。Java 語言的開發運行,也離不開 Java 語言的運行環境 JRE。沒有 JRE 的支持,Java 語言便無法運行。當然,如果還想編譯 Java 程序,搞搞小開…

負載均衡策略

輪循均衡(Round Robin):每一次來自網絡的請求輪流分配給內部中的服務器,從1至N然后重新開始。此種均衡算法適合于服務器組中的所有服務器都有相同的軟硬件配置并且平均服務請求相對均衡的情況。 我們的業務web服務器都是同樣配置…

Java基礎:Java數據類型

Java 是一種強類型語言,這就意味著必須為每一個變量聲明一種類型。在 Java 中基本數據類型共有 8 種,包括 4 種整型、2 種浮點型、1 種用于表現 Unicode 編碼的字符單元的字符類型 char 和一種用于表示真值的 boolean 類型 ~ 本篇主要記錄內容包括&#…

TCP連接的建立與終止

TCP連接的建立與終止 1.三次握手 TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方…

日常問題:MySQL排序字段數據相同不能分頁問題

【問題日期】 2022-11-14 22:45:12 【問題描述】 MySQL 排序字段數據相同不能分頁問題:在分頁查詢數據時,按創建時間排序,由于數據是批量創建的,導致部分數據創建時間一樣,而此時分頁查詢數據,翻頁后出現…

數據缺失值處理

數據缺失值處理 In [1]: import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer In [2]: df pd.DataFrame() df[…

Java基礎:Java數字類型

Java 中包含多種運算符:算數運算符、關系運算符、邏輯運算符、位運算符。在 Math 類中,包含了各種各樣的數學函數。在編寫不同類別的程序時,可能需要的函數也不同。要生成一個隨機數,可以使用 Random 對象。 ~ 本篇主要…

Java基礎:Java流程控制

塊(即復合語句)是指由一對大括號括起來的若干條簡單的 Java 語句。塊確定了變量的作用域。一個塊可以嵌套在另一個塊中。但是,不能在嵌套的兩個塊中聲明同名的變量。使用塊(有時稱為復合語句)可以在Java程序結構中原本…

Java基礎:Java類與對象

面向對象程序設計(簡稱OOP)是當今主流的程序設計范型,它已經取代了20世紀70年代的“結構化”過程化程序設計開發技術。Java是完全面向對象的,必須熟悉OOP才能夠編寫Java程序。面向對象的程序是由對象組成的,每個對象包…

SVN備份腳本

#!/bin/bash #svn全量備份腳本 wwytcode_path/home/wwytcode/project backup_path/home/bak Datedate %Y%m%d cd $backup_path echo date >> $back_path/svn_backup.log svnversionsvnlook youngest $wwytcode_path svnadmin dump --revision 0:$svnversion $wwytcode_pa…

Java基礎:Java面向對象

面向過程的優點是性能比面向對象高,不需要面向對象的實例化;缺點是不容易維護、復用和擴展。面向對象的優點是具有封裝、繼承、多態的特性,因而容易維護、復用和擴展,可以設計出低耦合的系統;缺點是由于需要實例化對象…