套接字(socket)基本知識與工作原理

套接字(socket)基本知識與工作原理

一、Socket相關概念

????Socket通常也稱作“套接字”,用于描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的。)

????SOCKET用于在兩個基于TCP/IP協議的應用程序之間相互通信。最早出現在UNIX系統中,是UNIX系統主要的信息傳遞方式。在WINDOWS系統中,SOCKET稱為WINSOCK兩個基本概念:客戶方和服務方。當兩個應用之間需要采用SOCKET通信時,首先需要在兩個應用之間(可能位于同一臺機器,也可能位于不同的機器)建立SOCKET連接,發起呼叫連接請求的一方為客戶方,接受呼叫連接請求的一方成為服務方。客戶方和服務方是相對的,同一個應用可以是客戶方,也可以是服務方。在客戶方呼叫連接請求之前,它必須知道服務方在哪里。所以需要知道服務方所在機器的IP地址或機器名稱,如果客戶方和服務方事前有一個約定就好了,這個約定就是PORT(端口號)。也就是說,客戶方可以通過服務方所在機器的IP地址或機器名稱和端口號唯一的確定方式來呼叫服務方。在客戶方呼叫之前,服務方必須處于偵聽狀態,偵聽是否有客戶要求建立連接。一旦接到連接請求,服務方可以根據情況建立或拒絕連接。連接方式有兩種,同步方式(Blocking)和(noBlocking).客戶方發送的消息可以是文本,也可以是二進制信息流。當客戶方的消息到達服務方端口時,會自動觸發一個事件(event),服務方只要接管該事件,就可以接受來自客戶方的消息了。

?

二、Socket有兩種類型:

  • ?流式Socket(STREAM)是一種面向連接的Socekt,針對面向連接的TCP服務應用,安全,但是效率低;
  • ?數據報式Socket(DATAGAM):是一種無連接的Socket,對應于無連接的UDP服務應用。不安(丟失,順序混亂,在接受端要分析重排及要求重發),但效率高。

三、Socket一般應用模式(服務端和客戶端)


?

服務端的Socket(至少需要兩個):

  • 一個負責接受客戶端連接請求(但不負責與客戶端通信)
  • 每成功接收到一個客戶端的連接便在服務端產生一個對應的Socket
    • 再接受到客戶端連接時創建。
    • 為每個連接成功的客戶端請求在服務端都創建一個對應的Socket(負責和客戶端通信)。

客戶端的Socket

  • 客戶端Socket
    • 必須指定要連接的服務端地址和端口。
    • 通過創建一個Socket對象來初始化一個到服務端的TCP連接。

?

Socket通信基本流程圖


?

?

Socket的通信過程

服務端:

  • 申請一個Socket
  • 綁定到一個IP地址和一個端口
  • 開啟偵聽,等待接受連接

客戶端:

  • 申請一個Socket
  • 連接服務器(指明IP地址和端口號)

????服務器端接到連接請求后,產生一個新的Socket(端口大于1024)與客戶端建立連接并進行通訊,原偵聽Socket繼續偵聽。

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

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

相關文章

python 多線程--重點知識

1.全局變量global的用法 2.多線程共享全局變量-args參數 注意args參數類型為元組,逗號不能少!

Flask WTForm表單的使用

運行環境: python2.7 flask 0.11 flask-wtf 0.14.2 wtform能夠通過一個類定義一些字段,這些字段會在前端生成標簽,并且通過設置字段的驗證規則,自動判斷前端輸入數據的格式。 一般用于用戶登錄,用戶注冊等信息錄入。…

Java與C#個人之比較

網上這方面的比較文章已經有不少了,不過大都是要么從很高的角度說的,要么就是從底層說的,本人就以自己這幾年的編程經歷中的感受,來談談自己的體會。 相似性: Java和C#都是一門面向對象的語言,Java更多地…

java利用子類求正方形_Java程序設計實驗2011

(2)掌握對象的聲明和使用;(3)掌握構造方法的概念和使用;(4)掌握類及成員的訪問控制符。2、實驗任務(1)閱讀下面的程序,在main()方法里添加語句完成如下的功能:①創建一個MyV alue類的對象myV alue。②為myV alue對象中的value域賦…

當導用模塊與包的import與from的問題(模塊與包的調用)

當在views.py里寫impor models會不會報錯呢? 1、Python里面的py文件都是每一行的代碼。2、Python解釋器去找一個模塊的時候,只去sys.path的路徑里找3、django項目啟動(django項目的啟動文件是manage.py)啟動項目是將manage.py的路…

ack和seq

ACK (Acknowledgement),即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。 seq是序列號,這是為了連接以后傳送數據用的,ack是對收到的數據包的確認&#xff…

MySQL中的information_schema

0.引言 近日在學習網絡安全的sql注入時,用到mysql中的information_schema數據庫,其思路是利用information_schema中的SCHEMA獲取數據庫中的table名稱。現在對相關數據庫進行總結,方便以后復習使用。 2.information_schema數據庫 informati…

linux配置防火墻,開啟端口

linux配置防火墻,開啟端口 Centos7,配置防火墻,開啟端口  1.查看已開放的端口(默認不開放任何端口)    firewall-cmd --list-ports  2.開啟80端口    firewall-cmd --zonepublic(作用域) --add-port80/tcp(端口和訪問類型) --permanent(永久…

使用Intel編譯器系列合集

好的帖子:http://topic.csdn.net/u/20080327/16/071b45df-3795-4bf1-9c4d-da4eb5aaa739.html參考手冊:http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm 說明:本系列文章為個…

【前端】這可能是你看過最全的css居中解決方案了~

1.水平居中&#xff1a;行內元素解決方案 適用元素&#xff1a;文字&#xff0c;鏈接&#xff0c;及其其它inline或者inline-*類型元素&#xff08;inline-block&#xff0c;inline-table&#xff0c;inline-flex&#xff09; html部分代碼:<div>文字元素</div><…

java手機一款三國游戲_JAVA熱游—富甲三國之雄霸天下原創心得

因為工作忙碌的關系&#xff0c;很長時間都沒有來關注手機游戲論壇&#xff0c;這款富甲三國.雄霸天下&#xff0c;我也是前天才拿到手。游戲比想象中的簡單&#xff0c;個人僅用了兩個小時時間&#xff0c;就將三個人物全部通關。游戲的開始畫面制作得比較精美&#xff0c;而且…

Python多線程--互斥鎖、死鎖

1、互斥鎖 為解決資源搶奪問題&#xff0c;使用mutex Threading.Lock()創建鎖&#xff0c;使用mutex.acquire()鎖定&#xff0c;使用mutex.release()釋放鎖。 代碼一&#xff1a; import threading import time# 定義一個全局變量 g_num 0def test1(num):global g_num# 上鎖…

freemind 要下載java_Freemind

動手編輯先按Ctrln&#xff0c;新建一個文件。這時出現了一個根節點。用光標單擊它&#xff0c;改成“我學FreeMind”&#xff0c;然后在節點之外任一地方點擊鼠標(或按Enter)完成編輯。然后&#xff0c;按Insert鍵&#xff0c;輸入“下載安裝”&#xff0c;按Enter鍵&#xff…

本地連不上遠程mysql數據庫(2)

Host is not allowed to connect to this MySQL server解決方法 今天在ubuntu上面裝完MySQL&#xff0c;卻發現在本地登錄可以&#xff0c;但是遠程登錄卻報錯Host is not allowed to connect to this MySQL server,找了半天試了網上的一些方法都沒有解決&#xff0c;最終在一篇…

理解EnterCriticalSection 臨界區

通俗解釋就像上廁所&#xff1a; 門鎖了&#xff0c;就等著&#xff0c;等到別人出來了&#xff0c;進去鎖上&#xff0c;然后該干什么干什么&#xff0c;干完了&#xff0c;把門打開 門沒鎖&#xff0c;就進去&#xff0c;鎖上&#xff0c;然后該干什么干什么&#xff0c;干…

Python多線程--UDP聊天器

import socket import threadingdef recv_msg(udp_socket):"""接收數據并顯示"""# 接收數據while True:recv_data udp_socket.recvfrom(1024)print(recv_data)def send_msg(udp_socket, dest_ip, dest_port):"""發送數據"&…

mvc:default-servlet-handler/作用

<mvc:default-servlet-handler/>使用默認的servlet來相應靜態文件&#xff0c;因為在web.xml中使用了DispatcherServlet截獲所有的請求url&#xff0c;而引入<scprit type"text/javascript" src"js/jquery-1.11.0.mim.js"/>的時候&#xff0c;…

java中如何做模糊查詢_到底Java里的模糊查詢語句該怎么寫

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓現在String sql"select * from car where carName like %?%";可以查詢出結果了&#xff0c;但問題又來了&#xff0c;只能查詢出一條結果&#xff0c;代碼如下carDao.java頁面public ArrayList queryAppoint(String car…

vector 、map 、iterator 之學習筆記

由于本人要接手一項C方面 的工作。由于不會C,不過做過JAVA 以及一些web方面的開發&#xff0c;加之時間比較短。所以需要速成&#xff0c;于是學習筆記也基本都是用代碼代替。 //范例資源文件 /****************************************************************************…