socket編程基礎,從了解到實現

2021-01-07 愚公要移山1

java生下來一開始就是為了計算機之間的通信,因此這篇文章也將開始介紹一下java使用socket進行計算機之間的通信,在上一篇文章中已經對網絡通信方面的基礎知識進行了總結,這篇文章將通過代碼案例來解釋說明。

一、網絡編程基礎

因為java網絡編程這塊是從基礎開始講解的,所以知識點也是由淺入深,因此還是有必要對一些基礎的知識進行回顧和掌握,如果你是大神,不喜勿噴。

1、兩臺計算機之間的通信

兩臺計算機如何實現通信呢?人類交流是通過定義一定的語言,計算機也是,他們之間必須要有相應的協議才可以。

也就是說,兩臺計算機要想通信必須要遵循一定的規則協議。通信流程基本上就是,一臺計算機上的一個埠號數據,然後通過協議發送到另外一臺計算機上的同一個埠號。這裡面有三個重要的部分需要我們去理解一下,當然不會細講,因為在上一篇文章中已經提出。

(1)TCP/IP協議

(2)IP位址

(3)埠

我們先講一下TCP/IP模型。

2、TCP/IP模型

TCP/IP模型就是上面的協議,它定義了一些規則來用於計算機之間的通信,同時也是世界上應用最為廣泛的協議。這個協議模型建立在TCP和IP協議上面(從名字也可以看出來)。

從上圖我們可以看到TCP/IP其實是處於傳輸層的,也就是我們的協議核心所在,TCP/IP協議定義了電子設備如何連入網際網路,以及數據如何在它們之間傳輸的標準。

3、IP位址

為了實現兩個網絡中不同計算機之間的通信,每臺計算機都必須有一個唯一的標識,就是中國公民每一個人都有一個惟一的身份證號碼一樣。

4、埠

我們知道一臺計算機其實是可以跑很多個程序的,那麼我們的程序怎麼就能準確無誤的到達另外一個程序呢?這其實就是使用了埠號來區分不同的應用程式。

埠號的範圍也很大0到65535。其中0到1023是保留的,也就是我們不能用的。那我們的今天所講的socket是如何組成的呢?其實就是由IP位址和埠號組成的。

二、socket通信

在上面其實我們對通訊需要掌握的一些基礎知識進行了分析,這裡我們開始使用java語言來演示一下這個過程。

socket通信其實是有兩種方式:TCP和UDP過程。

(1)TCP是可靠地面向連接的通信過程,含有三次握手四次揮手的機制。

(2)UDP是不可靠的無連接的通信過程,客戶端只管發,不管服務端有沒有接受到。

那這兩種通信方式的基本模型是什麼呢?我們使用一張圖來看一下:、

從上圖我們可以看到,Socket實現的步驟大體包含以下幾個步驟:

(1)創建Server和client的ServerSocket和Socket。

(2)打開連結到Socket的輸入輸出流

(3)按照協議對Socket進行讀取操作

(4)關閉輸入輸出流、關閉Socket。

下面我們就直接來看例子,然後再來分析這個例子:

1、基於TCP的socket通信

我們拿男孩做客戶端,女孩因為有很多人追求,所以做服務端,一個服務端可被多個男孩客戶端請求表白。我們這裡先看女孩服務端的具體步驟:

(1)創建ServerSocket對象,綁定監聽埠。

(2)通過accept()方法監聽客戶端請求

(3)連接建立後,通過輸入流讀取客戶端的數據

(4)通過輸出流,向客戶端回應信息

OK,基本的步驟就是這,我們就看一下代碼。

具體的步驟已經很清晰了,我們再來看看男孩客戶端的步驟:

(1)創建Socket並指定埠

(2)通過輸出流向服務端發送一個請求

(3)等待服務端的回應 獲取輸入流,讀取客戶端信息(將字節流轉化為字符流),並保存在緩衝區中

(4)關閉資源

下面同樣使用java代碼來演示一下。

這就是男孩追求女孩的代碼示例,說起來也很簡單。如果我們之前學習過socket編程,可能上述的這些代碼難不倒我們,不過如果從基礎開始入門學習,還是有必要對其兩個類進行說明一下。高手可跳過:

第一個:Socket

當我們想要在Java中使用TCP/IP通過網絡連接到伺服器時,就需要創建Socket對象並連接到伺服器。在服務端的Socket對應著連接的一個個客戶端。

第二個:ServerSocket

用ServerSocket實現java服務通過TCP/IP監聽客戶端連接,他只存在於服務端。

2、基於UDP的Socket通信

UDP的通信模式其實是無連接的不可靠的通信協議,舉個例子,花心男孩向女孩表白,就給女孩寫了一封情書,然後不管女孩有沒有收到情書,自己繼續向其他女孩表白。我們這裡還是以女孩為服務端。

我們首先來看一下服務端的步驟:

接收客戶端發送的數據

(1)創建伺服器端DatagramSocket指定埠

(2)創建數據報DatagramPacket,接收客戶端發送的數據

(3)接收客戶端發送的數據

(4)讀取數據

向客戶端響應數據

(1)定義客戶端的地址、埠號、數據

(2)創建數據報,包含響應的數據信息

(3)響應客戶端

(4)關閉資源

具體代碼來演示一下。

然後再來看一下客戶端的請求:

向伺服器端發送數據

(1)定義伺服器的地址、埠號、數據

(2)創建數據報,包含發送的數據信息

(3)創建DatagramSocket對象

(4)向伺服器端發送數據報

接收伺服器端響應的數據

(1)創建數據報DatagramPacket,用於接收伺服器端響應的數據

(2)接收伺服器響應的數據

(3)讀取數據

(4)關閉資源

我們再使用java語言來演示一下客戶端代碼

OK,以上就是socket通信的兩種基本方式,這裡只是給出了一個最最簡單的例子演示,這也是最基礎的代碼,後續文章會繼續加深難度。我們現在來總結一下這個Socket通信

從上面我們可以看到Java提供了非常易用的網絡API,調用這些API我們可以很方便的通過建立TCP/IP或UDP套接字,在網絡之間進行相互通信,但是其中TCP要比UDP更加常用。但是在一些場景下面。使用無連接的UDP要優於TCP。

相關焦點

  • Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信
    在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。
  • 基於Socket的java通信編程詳解
    Socket編程    一、網絡基礎知識(參考計算機網絡)  1、兩臺計算機間進行通訊需要以下三個條件:  IP位址、協議、埠號  2、TCP/IP協議:  是目前世界上應用最為廣泛的協議,是以TCP
  • Java socket編程
    而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的數據傳輸機制,這是網絡編程的主要對象,一般不需要關心IP層是如何處理數據的。目前較為流行的網絡編程模型是客戶機/伺服器(C/S)結構。即通信雙方一方作為伺服器等待客戶提出請求並予以響應。客戶則在需要服務時向伺服器提 出申請。
  • PHP SOCKET編程
    這時候就要監聽可寫事件,在純異步的編程中,必須去監聽可寫才能保證send操作是完全非阻塞的。del從reactor中移除,不再監聽事件callback就是事件發生後對應的處理邏輯,一般在add/set時制定。C語言用函數指針實現,JS可以用匿名函數,PHP可以用匿名函數、對象方法數組、字符串函數名。
  • 從socket到TCP協議,透徹理解網絡編程
    下面本文介紹一下網絡編程,網絡編程也稱為socket編程,socket通常譯作「套接字」,但原意其實意譯應該為」接口「。也就是作業系統提供給開發人員進行網絡開發的API接口。這套接口通常可以參數的調整支持多種協議,包括TCP、UDP和IP等等。下面本文從套接字編程和協議兩方面分別詳細的進行介紹。
  • 網絡編程基礎之Socket概述
    如上圖所示,我們可以Socket理解成應用層同傳輸層進行通信的一個接口,調用此接口,我們可以實現基於TCP協議,UDP協議等的應用層網絡通信程序。甚至,我們可以通過Socket接口開發實現通信協議。常見的Socket類型有以下幾種:流式Socket(SOCK_STREAM):流式socket提供可靠的,面向連接的通信流,它使用TCP協議,從而保證數據傳輸的正確性。數據報(SOCK_DGRAM):數據報Socket定義了一種無連接的服務,它使用UDP協議,通過相互獨立的數據報傳輸數據,協議本身不保證數據傳輸的可靠性及數據的原始順序。
  • 網絡編程基礎學習筆記2:socket接口及網絡編程三要素
    對於網絡編程而言,由於其底層語言是通過C語言來實現的,所以建議在學習的時候使用C語言來進行學習!網絡編程中常用的socket接口如下:socket()接口,用於創建socket;bind():用於綁定socket到本地地址和埠,通常由服務端調用(客戶端一般直接由connect直接主動去連結服務端);listen():用於開啟監聽模式,TCP專用;accept():用於伺服器等待客戶端連接,該情況一般在阻塞狀態下產生
  • 懶人入門網絡編程(四):實現一個socket長連接沒那麼簡單!
    下面我們按照這個步驟實現一個簡單的Echo伺服器來學習回顧一下socket編程的步驟。也由此引出我們如何實現一個socket長連接。所謂Echo伺服器,顧名思義就是一個回射伺服器,客戶端給伺服器發送消息,伺服器收到並做出響應,將客戶端發來的數據原封不動的返回給客戶端。
  • 簡單說說Python Socket編程步驟?
    小猿會從最基礎的面試題開始,每天一題。如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。廢話不多說,開始今天的題目:問:簡單說說Python socket編程步驟?
  • Python Socket 編程學習筆記
    瓜瓜君按:通過Python Socket模塊,實現server和client的通訊,這篇是一些學習筆記。1.
  • Windows編程技術:Socket通信(上)
    Socket翻譯成中文就是「套接字」的意思,所謂的Socket編程就是指用計算機語言通過編程來實現計算機之間的通信問題。Socket通信技術即就是兩臺聯網或者多臺聯網的計算機之間的數據交換技術,這就涉及著通信端的協議等等問題。
  • Linux C語言高級編程之Socket網絡編程!
    Socket網絡編程網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個
  • python socket編程的理解
    編寫server的步驟第一步創建socket對象。調用socket構造函數。如:socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。
  • 【java網絡】編程基礎
    伺服器創建一個伺服器套接字,一旦建立起與客戶的連接,伺服器就利用客戶套接字連接用戶1.1、伺服器套接字要創建一個伺服器,需要創建一個伺服器套接字(server socket)並把它附加到一個埠上,伺服器從埠監聽連接。
  • Socket網絡編程核心API深入分析(一):bind函數
    本文轉載自【微信公眾號:小碼逆襲,ID:gh_7c5a039380a0】經微信公眾號授權轉載,如需轉載與原文作者聯繫本篇文章你能學到:1、實現簡單的c++版本的伺服器和客戶端2、深入理解bind注意:本片文章涉及到的內核源碼來自linux內核版本3.6簡單的伺服器與客戶端實現本篇文章的重點在於從底層深入分析bind()函數,相信已經能夠自己實現一個簡單的伺服器和客戶端並進行交互,下面是一個簡單的demo,幫助大家複習一下socket編程api的調用過程。
  • Java Socket應用——通信是這樣煉成的
    (3)Sockets: 使用TCP協議實現網絡通信的Socket相關類。(4)Datagram: 使用UDP,將數據保存在數據報中實現網絡通信。三、通過Socket實現TCP編程3.1、伺服器端package com.shenfei;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/** 基於TCP協議的Socket通信,實現用戶登陸
  • PHP編寫基本的Socket程序
    環境配置socket 編程需要開啟 php 的 socket 擴展,我用的電腦是 windows,所以這裡你只需要打開 php.ini 文件,找到這一行去掉注釋就可以了官方文檔php 的 socket 編程的官方地址為:
  • Python基於Socket實現群聊
    套接字可以通過多種不同的通道類型實現:Unix域套接字,TCP,UDP等。套接字庫提供了處理公共傳輸的特定類,以及一個用於處理其餘部分的通用接口。1.1 socket模塊:要創建套接字,必須使用套接字模塊中的socket.socket()函數,該函數具有一般語法s = socket.socket (socket_family, socket_type, protocol = 0)1.2
  • 門禁系統socket通訊編程
    這樣在傳輸參數的時候老是提示參數錯誤,因為計算機是不能直接傳輸16進位的,會自行轉換,所有以下代碼非常完美的解決我的問題,同時也讓我認識到並不是所有socket都是需要一個客戶端和服務端代碼<?); // $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("udp")); // 創建Socket if (socket_connect($socket, "192.168.16.254", 8080)) { //連接 for ($j = 0; $j < count($sendStrArray); $j++) { socket_write
  • Python網絡編程socket模塊實例解析
    socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)。(1)利用socket進行簡單的連結Python裡面的socket支持UDP、TCP、以及進程間的通信,socket可以把我們想要發送的東西封裝起來,發送過去,然後反解成原來的樣子,事實上網路通信可以理解成都是建立在socket之上,下面的代碼是演示利用socket進行簡單的連結#要成一次通信,至少要有兩個人,也就是一個服務端