1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python之网络编程1-socket-tcp与udp

python之网络编程1-socket-tcp与udp

时间:2019-09-15 21:35:24

相关推荐

python之网络编程1-socket-tcp与udp

一、概念

两个独立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 socketsk=socket.socket() #sk为手机对象# sk.bind('ip','port') #绑定手机号sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 避免服务重启的时候报address already in usesk.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 socketsk=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 socketsk=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 socketsk=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 socketsk=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 socketsk=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 socketsk=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 socketsk=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 socketsk=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 socketimport timesk=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 socketsk=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()

参考自/Eva-J/p/5045061.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。