前言:Socket是計算機之間進行網路通信的一套程式介面,相當于在發送端和接收端之間建立了一個通信管道,在實際應用中,一些遠程管理軟體和網路安全軟體大多依賴于Socket來實作特定功能,本篇主要講解TCP(傳輸控制協議——在網路編程中應用的比較頻繁)方式在網路編程中的具體應用實體以及代碼詳解!
撰寫TCP時一般會用到(基本都會用到)以下的Socket模塊:
connect(address):連接遠程計算機
send(bytes[,flags]):發送資料
resv(bufsize[,flags]):接受資料
bind(address):系結地址
listen(backlog):開始監聽,等待客戶連接
accept():回應客戶端的一個請求
注:進行TCP通信的流程是,先開啟服務端等待監聽——>客戶端開始建立與服務器端的連接——>服務器端收到回應包再給客戶端發送回應包——>客戶端收到回應包繼續回應進行回圈——>回圈到通信結束后關閉連接(釋放資源,必須要做!)
舉例說明:設定對話系統,分為兩部分別為服務端和客戶端,能夠基本演示TCP通信程序,
服務器端代碼如下:
import socket #匯入socket模塊
s = socket.socket() #創建socket物件
host = '127.0.0.1' #設定本地主機
port = 8888 #設定埠
s.bind((host,port)) #系結埠
s.listen(6) #開始監聽,等待客戶連接
while True:
conn,addr = s.accept() #建立客戶連接
while True:
date = conn.recv(2048)
if date:
print("服務端收到,我再給你發一個包".format(date.decode()))
conn.send(date)
else:
conn.close()#關閉連接
break;
客戶端代碼如下:
import socket #匯入socket 模塊
c = socket.socket() #創建socket物件
host = '127.0.0.1' #設定本地主機
port = 8888 #設定埠號
c.connect((host,port))
mess = input('你將要對服務端做什么?').encode()
c.send(mess)
print('客戶端收到啦'.format(c.recv(2048)))
c.close()
演示結果如下:


接下來用具體例子來實作: 設計一個對話系統“小俊”,該應用為兩部分,一部分為服務端,一部分為客戶端,客戶端發送請求資訊(為服務端設定好的陳述句),服務端則回傳應答資訊,
實作之前先學習一下Socket()函式:
在python中,用socket()函式來創建套接字,語法格式如下:
socket.socket([family[,type[,protocol]]])
引數:
family:套接字家族可以使用AF_UNIX或AF_INET
type:套接字型別可以根據是面向連接的還是非連接的分為SOCK_STREAM或者SOCK_DGRAM
protocol:一般不填默認為0
服務端代碼如下:
import socket
language = {'who are you':'I am xiaofeng','how old are you':'21','where are you from':'china!'} #設定字典language為后面對話所對應的服務端和客戶端陳述句
host = '127.0.0.1'
port = 2222
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #宣告socket型別面向連接,套接字家族為AF_INET
s.bind((host,port) )#系結地址和埠
s.listen(3) #開始監聽,表示可以使用3個鏈接排隊
print("正在監聽2222埠呢")
conn,addr =s.accept() #這串代碼代表的意思是,等待回應客戶端請求,接受連接,其實是回傳兩個值,一個是地址127.0.0.7,一個是隨機監聽的埠
print('連接的地址和埠:',addr)#conn是客戶端鏈接過來,在服務器端為期生成的一個鏈接實體(沒啥用)
while True:
data = conn.recv(2048) #接受資料為2048位元組
data = data.decode() #資料解碼
if not data:
break
print ('接受到的資料:',data) #列印接受到資料
conn.sendall(language.get(data,'Nothing').encode()) #然后再發送資料為language字典里面的內容
conn.close() #連接關閉
s.close()#會話關閉
客戶端代碼如下:
import socket,sys
host = '127.0.0.1'
port = 2222
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #宣告socket型別面向連接,套接字家族為AF_INET
try:
s.connect((host,port))
except Exception as e:
print('服務端不存在!')
sys.exit()
while True:
conn = input('you say:')
s.sendall(conn.encode()) #發送資訊你叫什么名字?
data = s.recv(2048) #接受資料并指定大小為2048位元組
data = data.decode() #解碼接受的資料
print('接受到的資料:',data)
if conn.lower == "再見": #如果最后輸入再見,表示會話結束!
break
s.close()#會話關閉
輸出結果如下:


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/400506.html
標籤:其他
上一篇:HTTP and Flask Basics - HTTP Responses
下一篇:江湖救急筆記——計算機網路
