1. 程式人生 > 實用技巧 >python 網路程式設計

python 網路程式設計

osi 七層協議
應用層
表示層
會話層
上三層可以歸併為一層應用層(socket)
傳輸層 TCP UDP
網路層(ip層 加ip包頭)
資料鏈路層(加mac地址源目標地址)
物理層(底層0110)

首先我們通過socket來實現我們的簡單的客戶端與服務端的簡單程式碼
服務端程式碼接收並返回大寫字母回去

import socket
#AF_INET ipv4地址族 SOCK_STREAM 是一個流式協議,屬於tcp,所以存在粘包現象後面說
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn,client_addr = server.accept()
try:
while True:
res = conn.recv(1024)
if len(res) == 0: break
conn.send(res.upper())
except:
conn.close()

  

客戶端:

import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))

while True:
client.send(b'hello world')
data = client.recv(1024)
print(data.decode('utf-8'))
View Code

但是以上的客戶端我們只能實現對單使用者服務再來使用者我們就不能接客了哈哈,所以我們需要對程式碼進行改進這邊我們使用的socketserver來實現,在此之後會用多執行緒的方式實現。

```python
服務端程式碼
import
socketserver class MyHandle(socketserver.BaseRequestHandler): def handle(self): print(self.request)#相當於是conn 就是從半連線池中拿取的socket的連線處理的物件 while True: try: data = self.request.recv(1024) self.request.send(data) print(data) except: self.request.close() phone = socketserver.ThreadingTCPServer(("127.0.0.1",8080),MyHandle) phone.serve_forever()
#一直服務
View Code

客戶端程式碼
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))

while True:
msg = input("please input")
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
```
View Code


解釋下上面的場景為啥不會卡住,因為相當於是來一個請求,有訊息,我們的accept會從半連線池中取出連線控制代碼,開啟一個執行緒來執行我們的recv等操作,所以不會卡住,而如果不用執行緒則會陷入拿了控制代碼只能等這個處理結束了,才能再去拿控制代碼。

```python
#服務端程式碼如下:
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
import threading
def Talk(conn):
while True:
try:
res = conn.recv(1024)
print(res)
if len(res) == 0: break
res = res.decode("utf-8")
conn.send(res.upper().encode("utf-8"))
except:
conn.close()
while True:
conn,address = server.accept()
t = threading.Thread(target=Talk,args=(conn,))
t.start()
#客戶端如下:
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))

while True:
msg = input("please input")
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
```
View Code

補充
192.168.11.16/27
主機的個數為32-27=5 2^5=32 32 -2 =30主機數為30
主機範圍是0-31-63-95 必須是32的倍數,16在0-32之間 31是廣播地址 網路號是192.168.11.0
接下來會引入select敬請期待

原文地址:https://blog.csdn.net/wuyong15221125927/article/details/110824300 我的csdn部落格