1. 程式人生 > >socket迴圈接收通訊模板--day30

socket迴圈接收通訊模板--day30

socket迴圈接收通訊模板

TCP模板
import socket

# 買手機 預設得到是一個TCP的socket
server = socket.socket()
# 兩行程式碼的效果是一樣的
# server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

# socket的家族 AF_INET(基於網路型別) AF_UNIX(基於檔案型別)
# socket的型別:
# SOCK_STREAM 對應的是TCP SOCK_DGRAM 對應的是UDP
# 建立基於UDP的socket
# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)


server.bind(("127.0.0.1",16888)) # 繫結手機卡

# 引數可以設定最大的半連線數 最大5個
server.listen(5) # 開始待機

# 連線迴圈 可以不斷接受新連線
while True:
client, addr = server.accept()

# 通訊迴圈 可以不斷的收發資料
while True:
try:
# 如果是windows 對方強行關閉連線 會丟擲異常
# 如果是linux 不會丟擲異常 會死迴圈收到空的資料包
data = client.recv(1024)
if not data:
client.close()
break

print("收到客戶端發來的資料:%s" % data.decode("utf-8"))
client.send(data)
except ConnectionResetError:
print("客戶端強行關閉了連線")
client.close()
break

client.close() #結束通話電話
server.close() # 關機

客戶端

import socket

client = socket.socket()

client.connect(("127.0.0.1",16888))

client.send("hello 伺服器".encode("utf-8"))

print("===================")
data = client.recv(1024) # 該函式會阻塞 直到操作緩衝區有資料位置
print("===================")

print("收到伺服器:%s" % data.decode("utf-8"))

client.close()


----------------------------------------------------------------------------------

 

UDP模板

import socket

# UDP協議 在建立socket是 只有一個型別不同(socket.SOCK_DGRAM)
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0)

server.bind(("127.0.0.1",8888))

while True:
data,addr = server.recvfrom(1024) # 阻塞 直到收到資料為止
print("收到來自%s的訊息:%s" % (data.decode("utf-8"),addr[0]))
# 返回值為 資料 和 對方ip地址 和埠號
server.sendto(data.upper(),addr)

print(res)
server.close()

 

客戶端:
import socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

while True:
data = input(">>:").encode("utf-8")輸入要傳輸的資訊
client.sendto(data,("127.0.0.1",8888))指定傳輸的地址和埠號
d,addr = client.recvfrom(1024)接收包的大小
print(d.decode("utf-8"))

client.close()