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