详解地址: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的形式