<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
今天教大家通過Python進行Socket網路程式設計(做一個聊天程式),可以實現在不同的主機(電腦)之間進行通話。
具體效果如何,接著往下看:
可以看到使用者端(上方)向伺服器端(下方)傳送了內容,伺服器端進行了回覆
【備註:使用者端是我的本機,伺服器是另一條主機(阿里雲伺服器)】
兩臺主機的目的:驗證兩臺主機可以相互通訊
先簡單給大家介紹一下什麼是socket,socket(簡稱 通訊端) 是程序間通訊的一種方式,它與其他程序間通訊的一個主要不同是:它能實現不同主機間的程序間通訊。
我們網路上各種各樣的服務大多都是基於 Socket 來完成通訊的,例如瀏覽網頁、QQ 聊天、收發 email 等等
簡單的說:socket可以實現不同主機間進行通訊
ip相信大家都陌生了,每一臺主機都有一個ip,不同主機之間通訊的首要前提就是ip可以互訪,此外還有一個條件就是埠,比如我們經常聽到的80埠,3306埠,8080埠等。
主機中的資料是通過埠傳送和接收,需要將對應埠開啟才能進行通訊。
ip相當於家庭地址,埠相當於門或者窗戶
例子:
(主機A)快遞員要想將快遞(資料)送到你手中(另一臺主機B),需要知道你家的地址(主機B的ip),到你家門口後,需要你開啟門(主機B的埠)才能拿到快遞(資料)。
這裡需要分伺服器端和使用者端,使用者端傳送(主機A),伺服器接收(主機B),當然了,每一臺主機可以充當兩個角色(既是使用者端,也是伺服器),這樣就可以實現兩臺主機之間相互傳送和接收。
看到這裡之後,相信大家都清楚socket在實現不同主機之間通訊的大概意思了,下面開始Python程式碼實現。
先來分析使用者端(主機A)的實現過程:
from socket import * # 1.建立通訊端 tcp_socket = socket(AF_INET,SOCK_STREAM) # 2.準備連線伺服器,建立連線 serve_ip = "伺服器端(主機B)的IP" serve_port = 8000 #埠,比如8000 tcp_socket.connect((serve_ip,serve_port)) # 連線伺服器,建立連線,引數是元組形式
首先與伺服器接收端(主機B)建立連線,連線條件(主機B的ip和埠),這裡的埠8000是指將資料傳送到主機B的埠(主機B到時候會監聽8000埠,然後進行接收資料)
#準備需要傳送的資料 send_data = "今天是2021年08月29日,辰哥給伺服器端傳送資料了" tcp_socket.send(send_data.encode("gbk")) #從伺服器接收資料 #注意這個1024byte,大小根據需求自己設定 from_server_msg = tcp_socket.recv(1024) #加上.decode("gbk")可以解決亂碼 print(from_server_msg.decode("gbk")) #關閉連線 tcp_socket.close()
send_data是往伺服器端(主機B)傳送的內容,from_server_msg是伺服器端(主機B)往使用者端(主機A)傳送的內容
使用者端的程式碼就結束了
分析伺服器端(主機B)的實現過程:
from socket import * #建立通訊端 tcp_server = socket(AF_INET,SOCK_STREAM) #繫結ip,port #這裡ip預設本機 address = ('',8000) tcp_server.bind(address) # 啟動被動連線 #多少個使用者端可以連線 tcp_server.listen(128) #使用socket建立的通訊端預設的屬性是主動的 #使用listen將其變為被動的,這樣就可以接收別人的連結了
伺服器端(主機B)ip可以留空(預設本機),埠8000(因為使用者端往8000埠傳送資料,所以伺服器需要監聽的埠也是8000,與使用者端的埠一致)
# 建立接收 # 如果有新的使用者端來連結伺服器,那麼就產生一個新的通訊端專門為這個使用者端服務 client_socket, clientAddr = tcp_server.accept()
client_socket用來為這個使用者端服務,相當於的tcp_server通訊端的代理 tcp_server_socket就可以省下來專門等待其他新使用者端的連結 這裡clientAddr存放的就是連線伺服器的使用者端地址 #接收對方傳送過來的資料 from_client_msg = client_socket.recv(1024)#接收1024給位元組,這裡recv接收的不再是元組,區別UDP print("接收的資料:",from_client_msg.encode("gbk")) #傳送資料給使用者端 send_data = client_socket.send("使用者端你好,伺服器端收到,公眾號【Python研究者】".encode("gbk")) #關閉通訊端 #關閉為這個使用者端服務的通訊端,就意味著為不能再為這個使用者端服務了 #如果還需要服務,只能再次重新連 client_socket.close()
from_client_msgs 是伺服器端(主機B)接收到來自使用者端(主機A)傳送過來的資料send_data 是伺服器端(主機B)往使用者端(主機A)傳送過去的資料
伺服器端的程式碼就結束了
提醒:伺服器端的8000埠需要開啟,不然無法進行通訊
先啟動(執行)伺服器端(主機B)的程式,再執行使用者端(主機A)
可以看到使用者端(上方)向伺服器端(下方)傳送了內容,伺服器端進行了回覆
傳送和響應內容:
使用者端傳送:今天是2021年08月29日,辰哥給伺服器端傳送資料了
伺服器端接收並回復給使用者端:使用者端你好,伺服器端收到,公眾號【Python研究者】
上方動圖演示的是使用者端和伺服器端的一次通訊過程,可以將使用者端的傳送和伺服器端的接收放到迴圈中,實現持續通訊過程。
使用者端:
while(1): send_data = input("請輸入內容:") #send_data = "今天是2021年08月29日,辰哥給伺服器端傳送資料了" tcp_socket.send(send_data.encode("gbk")) if send_data == "exit": break; #從伺服器接收資料 #注意這個1024byte,大小根據需求自己設定 from_server_msg = tcp_socket.recv(1024) #加上.decode("gbk")可以解決亂碼 print(from_server_msg.decode("gbk")) #關閉連線 tcp_socket.close()
伺服器端:
while(1): #接收對方傳送過來的資料 from_client_msg = client_socket.recv(1024)#接收1024給位元組,這裡recv接收的不再是元組,區別UDP if(from_client_msg=="exit"): break print("接收的資料:",from_client_msg.decode("gbk")) now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) #傳送資料給使用者端 send_data = client_socket.send((str(now_time)+" 伺服器端:使用者端你好,伺服器端收到,公眾號【Python研究者】").encode("gbk")) #關閉通訊端 #關閉為這個使用者端服務的通訊端,就意味著為不能再為這個使用者端服務了 #如果還需要服務,只能再次重新連 client_socket.close()
使用者端可以持續給伺服器端傳送資料,伺服器接收資料後列印並返回資料給使用者端
伺服器端返回的內容:
當前系統時間+伺服器端:使用者端你好,伺服器端收到
最後當用戶端輸入:exit,則斷開與伺服器端的連線:
到此這篇關於python利用socket實現使用者端和伺服器端之間進行通訊 的文章就介紹到這了,更多相關python主機通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45