python --- 使用socket創建tcp服務

1. 網絡-tcp

參考

1.1 tcp簡介

介紹

TCP協議,傳輸控制協議(英語: Transmission Control Protocol, 縮寫為TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義.

TCP通信需要經過創建連接、數據傳送、終止連接三個步驟.

TCP通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似于生活中的"打電話"

TCP特點

  1. 面向連接

    • 通信雙方必須先建立連接才能進行數據的傳輸,雙方都必須為該連接分配必要的系統內核資源,以管理連接的狀態和連接上的傳輸。
    • 雙方間的數據傳輸都可以通過這一個連接進行。
    • 完成數據交換后,雙方必須斷開此連接,以釋放系統資源。
  2. 可靠傳輸

    • TCP采用發送應答機制
      • TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成果
    • 超時重傳
      • 發送端發送一個報文段之和就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段
      • TCP為了保證不發生丟包,就給每一個包一個序列號,同時序號也保證了傳送到接受端實體的包的按序接收
      • 然后接收端實體對已接收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被重傳.
    • 錯誤校驗
      • TCP用一個校驗和函數來校驗數據是否有錯誤;在發送和接收時都要計算校驗和
    • 流量控制和擁塞管理
      • 流量控制用來避免主機發送得過快而使接收方來不及完全收下

TCP與UDP的不同點

  • 面向連接(確認有創建三方交流,連接已創建才作傳輸)
  • 有序數據傳輸
  • 重發丟失的數據包
  • 舍棄重復的數據包
  • 無差錯的數據傳輸
  • 阻塞/流量控制

udp通信模型

udp通信模型中,在通信開始之前, 不需要建立相關的鏈接,只需要發送數據即可,類似于生活中的"寫信"

1.2 tcp網絡程序 - 客戶端(重點)

服務器就是提供服務的一方,客戶端就是需要被服務的一方

tcp客戶端

  1. 創建套接字
  2. 鏈接服務器
  3. 收發數據
  4. 關閉套接字
from socket import *def main:tcp_socket = socket(AF_INET, SOCK_STREAM)server_ip = input("請輸入要鏈接的ip: ")server_port = input("請輸入要鏈接的port: ")server_addr  = (server_ip, server_port)tcp_socket.connect(server_addr)send_data = input("請輸入要發送的數據: ")tcp_socket.send(send_data.encode("gbk"))tcp_socket.close()if __name__ == "__main__":main()

1.3 tcp服務器

  1. socket創建一個套接字
  2. bind綁定ip和port
  3. listen使套接字變為可用被動鏈接
  4. recv/send接收發送數據
from socket import *def main():# 創建tcp套接字tcp_server_socket = socket(AF_INET, SOCK_STREAM)# 綁定端口tcp_server_socket.bind(("", 7890))# 將tcp變為被動監聽tcp_server_socket.listen(128)# 接線員獲取客戶端的套接字和地址(ip和端口號)new_client_socket, client_addr = tcp_server_socket.accept()# 使用新的套接字進行通信recv_data = new_client_socket.recv(1024)  # 接收數據,最大為1024字節print(recv_data)# 返回數據new_client_socket.send("hahaha".encode("utf-8"))# 關閉套接字tcp_server_socket.close()new_client_socket.close()if __name__ == "__main__":main()

小結:

  • tcp服務器,創建的套接字主要是用來監聽的
  • 監聽得到新的交互的套接字(可用算是通道吧TuT)

1.3.1 為多個客戶端服務

同一時刻只能處理一個客戶端,但是多個客戶端同時連接,會按連接的順序進行阻塞~當一個客戶端處理完畢之后,會根據排隊順序處理后面的

from socket import *def main():# 創建tcp套接字tcp_server_socket = socket(AF_INET, SOCK_STREAM)# 綁定端口tcp_server_socket.bind(("", 7890))# 轉為被動監聽tcp_server_socket.listen(128)while True:print("等待一個新的客戶端的到來!")# 接收客戶端的套接字new_client_socket, client_addr = tcp_server_socket.accept()print("一個新的客戶端以及到來 %s" % str(client_addr))# 使用新的套接字進行收發數據recv_data = new_client_socket.recv(1024)print("客戶端發送過來的請求是: %s" % recv_data.decode("utf-8"))new_client_socket.send("Hello World".encode("utf-8"))# 關閉套接字new_client_socket.close()print("已經服務完畢...")tcp_server_socket.close()if __name__ == "__main__":main()

1.3.2 為多個客戶服務多次

from socket import *def main():tcp_sever_socket = socket(AF_INET, SOCK_STREAM)tcp_sever_socket.bind(("", 8080))tcp_sever_socket.listen(128)while True:print("等待客戶的到來...")new_socket, client_addr = tcp_sever_socket.accept()print("檢測到 %s 的到來" % str(client_addr))while True:recv_data = new_socket.recv(1024)if  recv_data:print("收到信息 %s" % recv_data.decode("gbk"))new_socket.send("收到您的信息~".encode("gbk"))else:breaknew_socket.close()print("服務完畢...")tcp_server_socket.close()if __name__ == "__main__":main()

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

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

相關文章

Linux基本的操作

一、為什么我們要學習Linux 相信大部分人的PC端都是用Windows系統的,那我們為什么要學習Linux這個操作系統呢???Windows圖形化界面做得這么好,日常基本使用的話,學習成本幾乎為零。 而Linux不一樣&#xff…

匯編語言 實驗4

實驗4 實驗內容1:綜合使用 loop,[bx],編寫完整匯編程序,實現向內存 b800:07b8 開始的連續 16 個 字單元重復填充字數據 0403H;修改0403H為0441H,再次運行 步驟1:在記事本中編寫好temp.asm文件 步驟2&#x…

python --- 線程

1. 多任務 - 線程 參考 首先考慮一個沒有多任務的程序: import timedef sing():# 唱歌 5 秒鐘for i in range(5):print("-----菊花臺ing....-----")time.sleep(1)def dance():# 跳舞 5秒鐘for i in range(5):print("-----跳舞.....-----")time.sleep(5)d…

Python 鏈接匯總

MNIST手寫識別 轉載于:https://www.cnblogs.com/bycnboy/p/9095199.html

17種常用的JS正則表達式 非負浮點數 非負正數

<input typetext idSYS_PAGE_JumpPage nameSYS_PAGE_JumpPage size3 maxlength5 οnkeyupthis.valuethis.value.replace(/[^1-9]\D*$/,"") οndragenter"return false" οnpaste"return !clipboardData.getData(text).match(/\D/)"" sty…

python --- 使用conda配置pytorch

使用Conda配置PyTorch 1. 添加channels 下載地址 $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ $ conda config --add channels htt…

LDAP第三天 MySQL+LDAP 安裝

https://www.easysoft.com/applications/openldap/back-sql-odbc.html OpenLDAP 使用 SQLServer 和 Oracle 數據庫。 https://www.cnblogs.com/bigbrotherer/p/7251372.html          CentOS7安裝OpenLDAPMySQLPHPLDAPadmin 1.安裝和設置數據庫 在CentOS7下&…

Myeclipse連接Mysql數據庫時報錯:Error while performing database login with the pro driver:unable...

driver template: Mysql connector/j&#xff08;下拉框進行選擇&#xff09; driver name: 任意填&#xff0c;最好是數據庫名稱&#xff0c;方便查找 connection URL: jdbc:mysql://localhost:3306/programmableweb User name: 用戶名 password: 密碼 Driver jars: 添加jar包…

Centos6.5靜態IP設置

1.創建新的虛擬機 2.打開終端&#xff0c;打開/etc/sysconfig/network-scripts/ifcfg-eth0文件 3.將BOOTPROTOstatic&#xff0c;原值為dhcp 4.添加 IPADDR192.168.43.125  #靜態IP GATEWAY192.168.43.1  #網關 NETMASK255.255.255.0  #子網掩碼 NETWORK192.168.43.0  …

matlab --- 圖像處理基礎

MATLAB圖像處理 1. 數字圖像處理 參考 數字圖像處理(Digital Image Processing)又稱為計算機圖像處理,是一種將圖像信號數字化利用計算進行處理的過程。隨著計算機科學、電子學和光學的發展,數字圖像處理已經廣泛的應用到諸多領域之中。本小節主要介紹圖像的概念、分類和數字…

java 注解默認值

package com.zejian.annotationdemo;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/** * Created by wuzejian on 2017/5/19. * 數據類型使用Demo */T…

[python、flask] - POST請求

1. 微信小程序POST傳遞數據給flask服務器 小程序端 // 提交POST數據 import { request } from "../../request/index.js"async handleDetectionPoints() {let params {url: "/detect_points",data: {"points": arr,"img_name": thi…

[vue]data數據屬性及ref獲取dom

data項的定義 this.$refs獲取dom 獲取不到數據 這樣中轉下才ok 小結: data里不能用this.$ref. 另外使用visjs時候 view-source:http://visjs.org/examples/network/basicUsage.html 加載不出東西,點了按鈕觸發才ok 小結: create里應該是從上到下執行的. 轉載于:https://www.cnb…

Linux命令基礎3

1. 計劃任務&#xff1a;分為”一次性“ 和”長期性“ 一次性任務是由atq服務/進程來實現的&#xff0c;計劃的管理操作是at命令&#xff1a; at <時間> : 安排一次性任務 atq 或at -l &#xff1a; 查看任務列表 at -c 序號&#xff1a; 預覽任務與設置環境 atrm 序號…

[異步、tensorflow] - 子線程操作tensor,主線程處理tensor

參考整體流程如下圖 代碼 import tensorflow as tf"""模擬: 子線程不停的取數據放入隊列中, 主線程從隊列中取數據執行包含: 作用域的命名、把程序的圖結構寫入事件、多線程 """# 模擬異步存入樣本. # 1、 定義一個隊列,長度為1000 with tf.va…

Element

官網&#xff1a;http://element-cn.eleme.io/#/zh-CN 轉載于:https://www.cnblogs.com/weibanggang/p/9995433.html

ubuntu18.04下安裝Anaconda及numpy、matplotlib

為了學習深度學習&#xff0c;我需要首先掌握利用python進行科學計算的知識&#xff0c;順便復習一下線性代數、微積分、概率論。當然&#xff0c;現在我要做的是安裝Anaconda。 1、官網下載&#xff0c;linux版本&#xff1a;https://www.anaconda.com/download 2、如果太慢&a…

[tensorflow] - csv文件讀取

參考 文件流程 csv讀取流程 函數的流程 import tensorflow as tf import os"""tensorflow中csv文件的讀取1、 先找到文件,構造一個列表2、 構造一個文件隊列3、 讀取(read)隊列內容csv: 讀取一行二進制文件: 指定一個樣本的bytes讀取圖片文件: 按一張一張…

課程模塊表結構

課程模塊 我們要開始寫課程模塊了~~課程模塊都有哪些功能呢~~ 我們的課程模塊&#xff0c;包括了免費課程以及專題課程兩個方向~~ 主要是課程的展示&#xff0c;點擊課程進入課程詳細頁面~~ 課程詳細頁面展示&#xff0c;課程的概述&#xff0c;課程的價格策略&#xff0c;課程…

vue中computed、metfods、watch的區別

一、computed和methods 我們可以將同一函數定義為一個 method 或者一個計算屬性。對于最終的結果&#xff0c;兩種方式確實是相同的。 不同的是computed計算屬性是基于它們的依賴進行緩存的。計算屬性computed只有在它的相關依賴發生改變時才會重新求值。這就意味著只要計算依賴…