python怎么網絡通信_深入Python中的網絡通信

TCP/IP

計算機與網絡設備兩情侶要談戀愛,相互通信,那么雙方就必須有規則。基于相同的方法,不同的硬件、操作系統之間的通信,都需要一種規則。而我們就把這種規則稱為協議(protocol)。

TCP/IP 是互聯網相關各類協議族的總稱。TCP/IP是指TCP和IP這兩種協議。TCP/IP是在IP協議的通信過程中,使用到的協議族的統稱。

TCP/IP協議族按層次分別為 應用層,傳輸層,網絡層,數據鏈路層,物理層。可以按照不同的模型分4層或者是7層。

將TCP/IP分為5層,越靠下越接近硬件。

應用層:應用程序收到傳輸層的數據后,接下來就是要進行解讀,解讀必須要先規定好格式,而應用層就是規定應用程序的數據格式,主要協議有HTTP等。

傳輸層:該層為兩臺主機上的應用程序提供端到端的通信,傳輸層有兩個傳輸協議為TCP(傳輸控制協議)和UDP(用戶數據報協議),TCP是一個可靠的面向連接的協議,UDP是不可靠或者說無連接的協議。

網絡層:決定如何將數據從發送方到接收方,是建立主機到主機的通信。

數據鏈路層:控制網絡層與物理層之間的通信,主要功能是保證物理線路上進行可靠的數據傳遞。

物理層:該層負責物理傳輸,與鏈路有關,也與傳輸的介質有關。

客戶端和服務器具體的

HTTP

圖片出自《圖解HTTP》書籍

三次握手,四次揮手

TCP三次握手,四次揮手,Runsen也不會怎么說,就把網上最通俗的圖放在下面 了,還是別看我很牛逼,牛逼的是做圖的大佬。

三次握手

四次揮手

圖片出自公眾號(程序員小小溪),更多的名詞和概念查找參考公眾號程序員小小溪的文章~[1]

Socket

網絡編程有一個重要的概念 socket(套接字),應用程序可以通過它發送或接收數據,套接字允許應用程序將 I/O 插入到網絡中,并與網絡中的其他應用程序進行通信。

我是來偷窺Python中的網絡通信Socket,不小心偷窺到了一個非常不錯的Socket好圖

將上面的圖片整理步驟

1.建立連接:

服務器:socket--->address--->bind--->listen--->accept

客戶端:socket--->connect

2.通信:收一發:recv(1024)

3.關閉連接:close()

實現簡單的通訊程序

服務端,server.py

#導入socket模塊

import?socket

#創建套接字?或使用server?=?socket.socket()

server?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)

#定義綁定的ip和端口,用元組定義

ip_port?=?('127.0.0.1',?8888)

#綁定監聽:bind(address),在AF_INET下,以元組(ip,port)的形式表示地址

server.bind(ip_port)

#設置最大連接數,默認為1

server.listen(5)

#不斷接受連接:one?byone

while?True:

print("等待數據連接中……")

#接受客服端數據請求

conn,?address?=?server.accept()

'''

向客服端返回信息

(注意:python3.x以上,網絡數據的發送接收都是byte類型,

發送接收String類型數據時需要對數據進行編碼(發送:messages.enconde();接收后轉為String類型:messages.deconde()),pyhon2.x則直接發送數據無須編碼)

'''

messages?=?"連接成功!"

conn.send(messages.encode())

#計數信息條數

count=?0

#一個連接中,不斷的接受客戶端發來的數據

while?True:

data?=?conn.recv(1024)

#打印客戶端發來的數據信息

print(data.decode())

#判斷是否退出當前連接,等在下一個連接

if?data?==?b'exit':

break

#處理客戶端數據(如:響應請求等)

count=count+?1

string?=?"第"+?str(count)?+"條信息:"+?data.decode()

conn.send(string.encode())

#主動關閉連接

conn.close()

客戶端,client.py

import?socket

#創建套接字

client?=?socket.socket()

#訪問的服務器的ip和端口,用元組定義

ip_port?=?("127.0.0.1",?8888)

#連接服務器主機

client.connect(ip_port)

#同一鏈接中,不斷向服務器發生數據或請求

while?True:

#接收服務器發送或響應的數據

data?=?client.recv(1024)

#打印接收的數據;python3.x以上數據要編碼(發送:data.enconde();接收后轉為String類型:data.deconde())

print(data.decode())

messages?=?input("請輸入發生或請求的數據(exit退出):")

client.send(messages.encode())

if?messages?==?'exit':

break

'''

#接收服務器發送或響應的數據

data?=?client.recv(1024)

#打印接收的數據;python3.x以上數據要編碼,發送enconde();接收deconde()

print(data.decode())

'''

#關閉連接

client.close()

具體效果如下圖所示。

多線程通信TCP服務器與多個TCP客戶端同時進行連續通信,只需要通過threading創建多線程任務handle_client就可以了。

import?socket

import?threading

import?random

def?handle_client():

#?接受客戶端請求鏈接

client,?address?=?server.accept()

print("[*]?Accept?connection?from:?%s:%d"%?(address[0],?address[1]))

messages?=?"Hello?World!"

client.send(messages.encode())

#?連續與當前連接的客戶端通信

while?True:

#?接受客戶端數據

request?=?(client.recv(1024)).decode()

#?判斷是否結束通信

if?request?==?'exit':

break

print("[*]?Received?from?%s:%d?:?%s"%?(address[0],?address[1],?request))

#?發送響應信息給客戶端

client.send((str(random.randint(1,?1000))?+?":"+"ACK!").encode())

#?關閉當前連接

client.close()

if?__name__?==?"__main__":

#?創建套接字

server?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)

#?定義綁定ip和端口

ip?=?'127.0.0.1'

port?=?8888

#?綁定監聽

server.bind((ip,?port))

#?設置最大連接數,默認為1

server.listen(5)

print("[*]?Listening?on?%s:%d"%?(ip,?port))

#?循環開啟線程,接受多個客戶端的鏈接通信

while?True:

#?創建一個線程

client_handler?=?threading.Thread(target=handle_client)

#?開啟線程

client_handler.start()

python3.x以上,網絡數據messages的發送接收都是byte類型,若要發送接收String類型數據時需要通過messages.enconde()對數據進行編碼,接收后通過messages.deconde()轉為String類型。pyhon2.x則直接發送數據無須編碼。

本文已收錄 GitHub,傳送門~[2] ,里面更有大廠面試完整考點,歡迎 Star。

Reference

[1] 參考公眾號程序員小小溪的文章:

https://mp.weixin.qq.com/s/KK1dnNoHrbjMyuhQptaBAQ

[2] 傳送門~:

https://github.com/MaoliRUNsen/runsenlearnpy100

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

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

相關文章

ReadWriteLock讀寫文件

概述 ReadWriteLock是一個接口,在它里面只定義了兩個方法:一個讀的鎖和一個寫的鎖。 讀的鎖:A線程獲取了讀的鎖,那么B線程也可以獲取讀的鎖。 寫的鎖:A線程獲取了寫的鎖,那么B線程不能獲取讀也不能獲取寫…

搞懂 Java HashMap 源碼

HashMap 源碼分析 前幾篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源碼,Java 容器除了包含 List 集合外還包含著 Set 和 Map 兩個重要的集合類型。而 HashMap 則是最具有代表性的,也是我們最常使用到…

python 怎么表示sqlserver null_如何使用Python將sqlserver查詢輸出寫入.txt文件?

我是Python新手,嘗試連接到sqlserverdb并將查詢的輸出轉換成一個flat.txt文件。在一些代碼正在工作,但是只寫了將近1000條記錄,然后就停止了。在Python版本:2.7.13。在下面的代碼能夠把100萬條記錄全部寫入csv文件而不是.txt文件&…

python中object是什么類型_Python 的 type 和 object 之間是怎么一種關系?

class,metaclass,instance,subclass,base 以下成立: 對任意的A,A是instance(推論:任意class也是instance) 對任意A,存在B,使得B是A的class A是cla…

java8新生代_jdk8.0的jvm詳情

jstat命令可以查看堆內存各部分的使用量,以及加載類的數量。命令的格式如下:jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]注意:使用的jdk版本是jdk8.[work16-11-118qf-pms]$ jstat -class 32417Loaded?? Bytes?? Unloaded?? B…

Java中的Runnable、Callable、Future、FutureTask的區別與示例

原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------------------------- Java中存在Runnable、Callable、Future、FutureTask這幾個與線程相關的類或者接口,在Java中也是比較重要的幾個概念&am…

sql count為空時顯示0_C0010負坐標顯示為正數+紅色0值參考線

小伙伴們早上好啊!今天繼續為大家分享柱形圖的美化技巧。希望大家認真閱讀Excel文件和教程,有的圖表看起來簡單,實際上在細節處理上用了很多技巧,大家要多多體會。C0010-負坐標顯示為正數紅色0值參考線效果圖圖表概述本圖可以用來…

配置IISExpress允許外部訪問

配置IISExpress允許外部訪問 1.找到IISExpress的配置文件&#xff0c;位于 <文檔>/IISExpress/config文件夾下&#xff0c;打開applicationhost.config&#xff0c;找到如下代碼&#xff1a;<site name"WebSite1" id"1" serverAutoStart"tru…

python布爾測試對象_python布爾類型和邏輯運算

布爾類型 python中True表示真&#xff0c;False表示假&#xff0c;它們是布爾類型&#xff1a;1 2>>> type(True) 在python中&#xff0c;bool的True和False是數值1和0的字符串表示格式&#xff0c;實際上bool類型是int類型的一個子類。1 2>>> bool.__bases_…

mac預裝的php路徑,Mac使用系統自帶php和Apache

最美的語言本文將介紹在Mac環境下如何使用系統本身所帶有的Apache(阿帕奇服務器)通過預裝的PHP版本來運行PHP的相關代碼&#xff0c;相對來講在OS X系統下相對好配置一些&#xff0c;因為Apache和PHP都預裝好了&#xff0c;如果是Windows環境我們需要自己安裝ApachePHPMysql(通…

線程池與Callable更配哦

概述 Callable介紹見&#xff1a;http://blog.csdn.net/zengmingen/article/details/53288119 多線程介紹見&#xff1a;http://blog.csdn.net/zengmingen/article/details/53284999 代碼 TaskCallable.javapackage multithreading.pool;import java.util.concurrent.Callabl…

IP編址,IP地址介紹與子網劃分方法

網絡層位于數據鏈路層與傳輸層之間。網絡層中包含了許多協議&#xff0c;其中最為重要的協議就是IP協議。網絡層提供了IP路由功能。理解IP路由除了要熟悉IP協議的工作機制之外&#xff0c;還必須理解IP編址以及如何合理地使用IP地址來設計網絡。 上層協議類型 以太網幀中的Typ…

3- OpenCV+TensorFlow 入門人工智能圖像處理-TensorFlow入門

tensorflow基礎入門 思考一個問題: 如何剛好學習TensorFlow 類比為一門開發語言&#xff0c;學會語法&#xff0c;api的調用&#xff0c; 原理性掌握。語言的要素: 基礎數據類型 運算符 流程 字典 數組 import tensorflow as tf# 常量&#xff0c;指定數據類型 data1 tf.const…

r 函數返回多個值_第四講 R描述性統計分析

在“R與生物統計專題”中&#xff0c;我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。以從淺入深&#xff0c;層層遞進的形式在投必得醫學公眾號更新。在上一講中&#xff0c;我們介紹了第三講 R編程基礎-矩陣和數據框 (戳這里即可跳轉)。到現在為止&#xff0c;大…

python雙線性插值函數_雙線性插值法原理 python實現

碼字不易&#xff0c;如果此文對你有所幫助&#xff0c;請幫忙點贊&#xff0c;感謝&#xff01;一. 雙線性插值法原理&#xff1a;① 何為線性插值&#xff1f;插值就是在兩個數之間插入一個數&#xff0c;線性插值原理圖如下&#xff1a;在位置 x 進行線性插值&#xff0c;插…

張恩民 php,php100教程_php100張恩民php視頻 56課時_網站編程_寂涯網絡學習基地

1、PHP基本語法和數據類型&#xff1a;(1)、PHP基本語法&#xff1a;1、htm 和 php 混編2、一個語句以 ; (分號結束)3、如何定義一個變量&#xff0c;和變量的使用(2)、PHP數據運算類型四種標量類型&#xff1a;boolean(布爾型)integer(整型)float(浮點型&#xff0c;也作“do…

Oracle 自帶sqldeveloper導入數據到表

步驟 1、建一張字段名和類型與要導入數據一致的表。 2、如果是excel文件&#xff0c;另存為 csv文件。 因為excel文件遇到空格會報錯&#xff0c;excel文件太大工具會讀取文件失敗。 而csv文件是秒級讀取&#xff0c;有空格也會導入不會報錯。 ------------- 更多的Java&am…

百度騰訊中興華為全部入局Linux Foundation深度學習基金會

2019獨角獸企業重金招聘Python工程師標準>>> 雖然名字叫做Linux Foundation&#xff0c;但是這家基金會關注的領域并不局限在Linux操作系統領域。事實上&#xff0c;Linux Foundation基金會還為很多其他開源基金和項目提供支持&#xff0c;比如Cloud Foundry、Autom…

python判斷點在矩形內_判斷平面內矩形和圓是否有交點的python實現

#! /usr/bin/env python# -*- coding: utf-8 -*-filename : 平面坐標內矩形與圓是否相交usage :authors : U{peterguo}copyright: tencentdate : 2012.08.21version : 1.0.0.0Modified History:2012.08.21 創建import osimport sysimport reimport urllib2import timeimport da…

python讀取mysql數據庫_Python操作MySQL數據庫9個實用實例

在Windows平臺上安裝mysql模塊用于Python開發 用python連接mysql的時候&#xff0c;需要用的安裝版本&#xff0c;源碼版本容易有錯誤提示。下邊是打包了32與64版本。 MySQL-python-1.2.3.win32-py2.7.exe MySQL-python-1.2.3.win-amd64-py2.7.exe 實例 1、取得 MYSQL 的版本 #…