詳解地址:https://www.cnblogs.com/mys6/p/10587673.html
TCP
server端
import socket
sk = socket.socket() # 創建了一個socket對象
sk.bind(('192.168.21.36',8080)) # 綁定一台機器的(ip,端口)
# 回環地址 - 指向自己這台機器
sk.listen() # 建立監聽等待別人連接
conn,addr = sk.accept() # 阻塞:在這里等待直到接到一個連接
# conn是連接
# addr是對方的地址
print(conn)
print(addr)
conn.send(b'hello') # 和對方打招呼
msg = conn.recv(1024) # 對方和我說的話
# 有發必有收 收發必相等
print(msg)
conn.close() # 掛電話
sk.close() # 關機
client端
import socket
sk = socket.socket() # 買個手機
sk.connect(('127.0.0.1',8080)) # 撥號
ret = sk.recv(1024)
print(ret)
sk.send(b'byebye!')
sk.close()
TCP聊天小工具
server端
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('192.168.21.36',9000))
sk.listen()
while True:
conn,addr = sk.accept() # 接收連接 三次握手conn
while True:
inp = input('>>>')
if inp == 'q':
conn.send(inp.encode('utf-8'))
break
conn.send(inp.encode('utf-8'))
msg = conn.recv(1024)
if msg == b'q':break
print(msg.decode('utf-8'))
conn.close() # 四次揮手
sk.close()
client端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
msg = sk.recv(1024)
print(msg.decode('utf-8'))
if msg == b'q':break
inp = input('>>>')
if inp == 'q':
sk.send(inp.encode('utf-8'))
break
sk.send(inp.encode('utf-8'))
sk.close()
client1
再加一個client2
#server client 已建立了長連接通道,client2發送的消息只能等待,直到服務端和client1斷開
server服務端建立一個長連接,作為和client斷開后,繼續下一個連接通道,調整如下:
server端
UDP
server端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) # 建立一個socket對象,
# 指定以UDP協議的形式來連接
sk.bind(('127.0.0.1',8080))
# 指定服務的地址
msg,addr = sk.recvfrom(1024) # 接收消息,發送端的地址
print(msg,addr)
sk.sendto(b'HELLO',addr) # 給發送端回復消息
sk.close() # 關閉socket連接

# UDP的server不需要進行監聽也不需要建立建立連接
# 在啟動服務之后只能被動的等待客戶端發送消息過來
# 客戶端發送消息的同時還會自帶地址信息
# 消息回復的時候 不僅需要發送消息,還需要把對方的地址填寫上
client端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto(b'hello',('127.0.0.1',8080)) # 直接給服務器發送一段消息
msg,addr = sk.recvfrom(1024) # 接收對面的回信
print(msg)
sk.close()

udp聊天的小程序
server端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))
while True:
msg,addr = sk.recvfrom(1024)
print('來自[%s:%s]的消息--%s'%(addr[0],addr[1],msg.decode('utf-8')))
inp = input('>>>')
sk.sendto(inp.encode('utf-8'),addr)
sk.close()
client端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1',9090)
while True:
msg = input('>>>')
sk.sendto(msg.encode('utf-8'),addr)
msg_recv,addr = sk.recvfrom(1024)
print(msg_recv.decode('utf-8'))
sk.close()
QQ多人聊天(用戶帶顏色而且顯示地址、端口)
時間服務器
# 需求
# 寫一個時間同步的服務器
# 服務端接收請求
# 按照client端發送的時間格式,將服務器時間轉換成對應格式
# 發送給客戶端
server端---------
import time
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))
while True:
msg,addr = sk.recvfrom(1024)
# msg 客戶端發送給server端的時間格式 "%Y-%m-%d %H:%M-%S"
time_format = msg.decode('utf-8')
time_str = time.strftime(time_format)
sk.sendto(time_str.encode('utf-8'),addr)
sk.close()
client端----
# client端每隔一段時間發送請求到服務端
# 發送時間的格式
import time
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9000))
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.close()
# 方式一
# 操作系統的定時任務 + python代碼的形式
# 方式二
# while True + time.sleep的形式