一、概念
两个独立python文件之间可以通过写入文件,读取文件进行交互
由于不同机器上的程序要通信,才产生了网络
B/S架构统一入口,各种小程序和公众号
服务端 一直运行,等待服务别人
客户端 用的时候,才使用服务
想要实现通信
网卡 和 网线
网卡上有全球唯一的mac地址(物理地址)
4个点分十进制
4个八位二进制:00000000.00000000.00000000.00000000
0.0.0.0-255.255.255.255
通过ip地址就能找到对应的mac地址:遵循arp协议
交换机-多台机器间的通信问题:广播风暴
网关:局域网中的机器想要访问局域网外的机器,需要通过网关访问
子网掩码与IP地址进行按位与 运算 得到网段地址:可判断电脑是否在同一个网段内
端口:找到的程序
在同一时间只会有一个程序占用一个端口
不可能在同一时间 有两个程序 占用同一个端口
端口范围:0-65535
一般用8000之后的端口
ip:确定唯一一台机器
127.0.0.1 本地的回环地址
端口:确定唯一的一个程序
ip+端口:找到唯一的一台机器上的唯一的一个程序
二、socket初认识
server端:
#server端
import socket
sk=socket.socket() #sk为手机对象
# sk.bind('ip','port') #绑定手机号
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 避免服务重启的时候报address already in use
sk.bind(('127.0.0.1',8080))
sk.listen() # 监听。等电话过程
conn,addr=sk.accept() #接收到别人电话 connection连接,与它连接的address地址
print(addr)
while True:# ret=conn.recv(1024) # 听别人说话# print(ret)# conn.send(b'hi') # 我和别人说话,必须传一个bytes类型# ret=conn.recv(1024)# print(ret.decode('utf-8'))# conn.send(bytes('大碗油泼面',encoding='utf-8'))ret=conn.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret)info=input('>>>')conn.send(bytes(info,encoding='utf-8'))
conn.close() #挂电话
sk.close() #关手机
client端:
# client端
import socket
sk=socket.socket() #买手机
sk.connect(('127.0.0.1',8080)) #拨别人的号
while True:# sk.send(b'hello')# ret=sk.recv()# print(ret)# sk.send(bytes('中午吃什么?'.encode('utf-8')))# ret=sk.recv(1024)# print(ret.decode('utf-8'))info=input(">>>")sk.send(bytes(info,encoding='utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret)if ret=='bye':sk.send(b'bye')breaksk.close()
三、socket之udp和tcp
TCP-demo:
server端:
#server端
import socket
sk=socket.socket() #买手机 创建一个socket对象
sk.bind(('127.0.0.1',8080)) #绑定ip和端口,启动服务
sk.listen() #写几就是几个,不写就是不限制conn,addr=sk.accept() #获取到一个客户端的连接,已经完成了三次握手# 阻塞
# msg = conn.recv(1024) # 阻塞
# print(msg.decode('utf-8'))
while True:info=input('>>>')if info=='bye':conn.send(b'bye') # 发消息breakconn.send(info.encode('utf-8')) #发消息ret=conn.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret)
conn.close()
sk.close() #关闭socket对象,如果不关闭,还能继续接收
client端:
# client端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:msg=input('>>>')if msg=='bye':sk.send(b'bye')breaksk.send(msg.encode('utf-8'))ret=sk.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret)
sk.close()
UDP-demo:
server端:
# server端
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8080))msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.sendto(b'bye',addr)# udp的server不需要监听和建立连接
# 而是在启动服务后,只能被动的等待客户端发送消息过来
# 客户端发送消息的同时还会 自带地址信息
# 消息回复时,不仅需要发送消息,还需要把对方的地址发送过去
client端:
# client端
import socket
sk=socket.socket(socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
sk.sendto(b'hello',ip_port)
ret,addr=sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()
四、利用udp实现qq聊天功能:
server:
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8080))
while True:msg,addr=sk.recvfrom(1024)print(addr)print(msg.decode('utf-8'))info=input('>>>').encode('utf-8')sk.sendto(info,addr)
sk.close()
client1:
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
while True:# info=input("tiger哥:").encode('utf-8')info = input("tiger哥:")info=('\033[34m来自tiger哥的消息 %s\033[0m'%info).encode('utf-8')sk.sendto(info,ip_port)msg,addr=sk.recvfrom(1024)print(msg.decode('utf-8'))sk.close()
client2:
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
while True:# info=input("二哥:").encode('utf-8')info = input("二哥:")info=('\033[32m来自二哥的消息 %s\033[0m'%info).encode('utf-8')sk.sendto(info,ip_port)msg,addr=sk.recvfrom(1024)print(msg.decode('utf-8'))sk.close()
五:UDP实现时间转换
server端:
# 需求# 写一个时间同步的服务器# 服务端接收请求# 按照client端发送的时间格式,将服务器时间转换成对应格式# 发送给客户端
import socket
import time
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))
while True:msg,addr=sk.recvfrom(1024)time_format=msg.decode('utf-8')time_str=time.strftime(time_format)sk.sendto(time_str.encode("utf-8"),addr)
sk.close()
client端:
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()
参考自https://www.cnblogs.com/Eva-J/p/5045061.html