1. 程式人生 > >python_day26__socket網路程式設計基礎程式設計知識

python_day26__socket網路程式設計基礎程式設計知識

server.py (server服務端):

#Author:'haijing'
#date:2018/10/30
#服務端:在別人的哪裡

import socket #socket是一個介面 內部封裝了有關ip地址和埠號的資訊 並且建立ip和埠號

#在socket類中family=AE_INET type=SOCK_STRAM;INET是在ipv4網路下的一個引數;
# SOCK_STRAM是資料流建立tcp連線的資料
#SOCK_Dgram 建立UDP連線的資料
# family=AE_INET 伺服器之間的通訊
# family=AE_UNIX Unix不同程序之間的通訊
sk = socket.socket() #建立一個socket物件sk 服務端的sk物件和客戶端的sk物件完全是不一樣的


address = ('127.0.0.1',8000) #設定一個元組,元組內放的是ip和埠號
#埠號都是自己任意新增,0-1024都是系統給我們設定的,能用的是1024之後的
#以後用8000以後就好了

sk.bind(address) #繫結ip和埠號,bind方法後跟的必須是一個元組

sk.listen(3) #3表示服務端最多和三個客戶端同時建立通訊

print('waiting...')
conn,addr = sk.accept() #等待客戶端來連線服務端 sk.accept是一個元組,裡面有兩個內容,分別用conn和addr來盛
#conn拿到的是某一個客戶端的socket物件,addr是建立連線的client.py的ip地址和埠號等資訊

# print(conn)#(<socket.socket fd=504, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 52686)>, ('127.0.0.1', 52686))
#conn中封裝了建立的socket資訊

#接下就是進行服務端和客戶端之間進行通訊
#客戶端先發送第一條訊息
# server下的方法:bind() listen() accept() recv()收 send()發的是一個位元組 sendall()發,一次發不乾淨多次發

#client下的方法:connect()

#只要建立好連線之後,誰先發送都沒有問題,關鍵是要一發一收 *****
#server端發
inp = input('>>>') #從鍵盤上輸入一個數據
inp_server = bytes(inp,'utf8') #字元轉換,在python3中傳送的值一定是bytes型別,在python2中沒有此問題
conn.send(inp_server) #第33行 對應client.py下第十一行的接收函式data=sk.recv()

#server端收
data = conn.recv(1024) #sk是server端自己的sk,真正與客戶端進行通訊的物件是conn這個物件
#而且不可能只有一個客戶端,所以手法資料都是通過conn找到對應的客戶端進行通訊的
#sk只是用於進行服務端和客戶端之間進行連線用的
data = str(data,'utf8') #將bytes型別轉換為字串型別,同時支援漢字
print(data)


client.py(client客戶端):
#Author:'haijing'
#date:2018/10/30
#客戶端:在自己的電腦上 不需要去繫結 直接去連線

import socket
sk = socket.socket() #建立socket物件 服務端的sk物件和客戶端的sk物件完全是不一樣的

address = ('127.0.0.1',8000) #設定元組 裡面放的是需要連線的伺服器的ip地址
sk.connect(address) #連線ip地址為127.0.0.1的服務端

#client端收
data = sk.recv(1024) #11行,一次最多收1024k 對應server.py下第33行的傳送函式:conn,send('hello') 如果服務端不給發資料,那麼就一直停在這裡
data = str(data,'utf8') #將bytes型別轉換為字串型別,同時支援漢字
print(data)

#client端發
inp_client = input('>>>')
inp_client = bytes(inp_client,'utf8')
sk.send(inp_client)

sk.close #關的此客戶端是和服務端之間的通訊通道,同樣server端也是有關掉通訊通道的能力,但是server端一般是不會關的

接下來是這兩部分py檔案的執行圖片:
server端:


client端:


原理圖:


haijing in HZ 最近壓力好大,要去猜測別人的想法 真的是很累 而且明明已經很盡力的去做事了,為什麼還是被別人給插了一刀
2018.11.1 不過今天傍晚的雲彩倒還是挺漂亮的,附上圖的吧還是,希望某人也可以看得到