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 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
python之网络编程1-socket-tcp与udp相关推荐
- Python之网络编程(socket基础)
文章目录 客户端/服务器架构 1.即C/S架构 2.C/S架构与socket的关系 3.两机交互的原理 Socket编程 1.socket编程的概念 2.socket的两种类型 3.socket的运行 ...
- Python之网络编程(Socket)
1.网络通信原理与互联网协议 详见:https://www.cnblogs.com/JackLi07/p/9218039.html 2.socket层 以上是tcp/ip五层协议的结构图,我们没有看到 ...
- 基于socket网络编程技术实现TCP和UDP的流程详解及实例
具体函数讲解太多,根据程序自行分析. 可以参考这篇文章: https://blog.csdn.net/qq_41687938/article/details/119102328?spm=1001.20 ...
- 【Java 网络编程】Socket TCP UDP 联系
文章目录 I 信息传输关注点 II Socket 与 TCP UDP 关系 III Socket 连接组成 ( IP地址 + 端口号 ) IV Socket TCP V Socket UDP VI C ...
- 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
tcp和udp的客户端和服务端收发流程 1.udp服务器流程: 1.创建serverSocket 2.设置服务器地址 serverAddr 3.将serverSocket和serverAddr绑定 b ...
- tcp udp区别优缺点_Linux网络编程面试题--tcp和udp的区别
(1)TCP是基于连接的,UDP是基于无连接的. (2)TCP的数据是可靠的,UDP的数据是不可靠的. (3)TCP的数据是有序的,UDP的数据是无序的. (4)TCP不保存用户边界,UDP保存用户边 ...
- Python之网络编程(基于tcp实现远程执行命令)
文章目录 实现目标 服务端分析 客户端分析 远程执行结果 本篇是用tcp套接字实现的一个远程执行命令的小案例,tcp套接字是一种面向连接的Socekt,针对面向连接的TCP服务应用,安全,但是效率低 ...
- Python中网络编程对 socket accept 函数的理解
在服务器端,socket()返回的套接字用于监听(listen)和接受(accept),这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回一个新的套接字, ...
- 网络编程2(TCP、UDP)
多路复用 多路复用 select pselect poll epoll 多路复用 使用一个进程(且只有一个主线程)同时监控若干个socket文件描述符的读写,这种读写模式叫做多路复用 多用于T ...
- Python之网络编程(TCP套接字与UDP套接字)
文章目录 基于tcp的套接字 实现目标 tcp服务端源码 tcp客户端源码 tcp效果实现 基于udp的套接字 udp作用介绍 udp服务端源码 udp客户端源码 udp效果实现 用udp实现一个时间 ...
最新文章
- 如何加入家庭组计算机打印机,如何使用利用win7家庭组打印机
- DNA复制体结构和工作原理首次被揭示
- Oracle数据库的视图
- C 双向链表的简单排序实现
- ansible模块介绍
- 使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句
- pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记
- 解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足
- 荔枝服务器维护,手把手为你讲解win10系统自动维护功能管理的问题.
- 计算机网络10--路由冗余备份,缺省(静态)路由配置
- matlab解方java_matlab解方程
- wxpython 设置热键
- Edge浏览器在新标签页打开链接(操作方法)
- 时间序列常见模型介绍与实战(SPSS)
- MySQL中利用经纬度计算两点之间的距离
- 代码审计:企业级web代码安全架构读书笔记(一)
- 企业级硬盘产品这么多,到底该选哪一个?
- 知行大数据分析平台需求说明
- 5-10 列车调度 (25分)
- Git之detached HEAD
热门文章
- 远程连接redis遇到的一些错误解决办法JedisConnectionException:java.net.SocketTimeOutException...JedisDataException:D
- 控制台出现Failed to bind properties under ‘spring.datasource‘ to javax.sql.DataSource
- 什么叫做项目孵化_蓝莓孵化营12进5争夺战,项目人绽放自我不留遗憾
- java同样作用的方法_Java的接口用途和方法
- mysql初体验学习笔记_【MySQL】mycli初体验
- mac玩rust用什么画质_Mac上的活动监视器到底有什么用?你会用么?
- 10 - java 权限修饰符
- Java 线程状态流转
- ul 原点显示_web前端开发学习教程,CSS HTML - ul li列表原点如何相连
- SQL关联查询————LEFT JOIN关键字的使用