一、概念

两个独立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相关推荐

  1. Python之网络编程(socket基础)

    文章目录 客户端/服务器架构 1.即C/S架构 2.C/S架构与socket的关系 3.两机交互的原理 Socket编程 1.socket编程的概念 2.socket的两种类型 3.socket的运行 ...

  2. Python之网络编程(Socket)

    1.网络通信原理与互联网协议 详见:https://www.cnblogs.com/JackLi07/p/9218039.html 2.socket层 以上是tcp/ip五层协议的结构图,我们没有看到 ...

  3. 基于socket网络编程技术实现TCP和UDP的流程详解及实例

    具体函数讲解太多,根据程序自行分析. 可以参考这篇文章: https://blog.csdn.net/qq_41687938/article/details/119102328?spm=1001.20 ...

  4. 【Java 网络编程】Socket TCP UDP 联系

    文章目录 I 信息传输关注点 II Socket 与 TCP UDP 关系 III Socket 连接组成 ( IP地址 + 端口号 ) IV Socket TCP V Socket UDP VI C ...

  5. 【Socket网络编程】4.tcp和udp的客户端和服务端收发流程

    tcp和udp的客户端和服务端收发流程 1.udp服务器流程: 1.创建serverSocket 2.设置服务器地址 serverAddr 3.将serverSocket和serverAddr绑定 b ...

  6. tcp udp区别优缺点_Linux网络编程面试题--tcp和udp的区别

    (1)TCP是基于连接的,UDP是基于无连接的. (2)TCP的数据是可靠的,UDP的数据是不可靠的. (3)TCP的数据是有序的,UDP的数据是无序的. (4)TCP不保存用户边界,UDP保存用户边 ...

  7. Python之网络编程(基于tcp实现远程执行命令)

    文章目录 实现目标 服务端分析 客户端分析 远程执行结果 本篇是用tcp套接字实现的一个远程执行命令的小案例,tcp套接字是一种面向连接的Socekt,针对面向连接的TCP服务应用,安全,但是效率低 ...

  8. Python中网络编程对 socket accept 函数的理解

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept),这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回一个新的套接字, ...

  9. 网络编程2(TCP、UDP)

    多路复用 多路复用 select pselect poll epoll 多路复用 ​ 使用一个进程(且只有一个主线程)同时监控若干个socket文件描述符的读写,这种读写模式叫做多路复用 ​ 多用于T ...

  10. Python之网络编程(TCP套接字与UDP套接字)

    文章目录 基于tcp的套接字 实现目标 tcp服务端源码 tcp客户端源码 tcp效果实现 基于udp的套接字 udp作用介绍 udp服务端源码 udp客户端源码 udp效果实现 用udp实现一个时间 ...

最新文章

  1. 如何加入家庭组计算机打印机,如何使用利用win7家庭组打印机
  2. DNA复制体结构和工作原理首次被揭示
  3. Oracle数据库的视图
  4. C 双向链表的简单排序实现
  5. ansible模块介绍
  6. 使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句
  7. pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记
  8. 解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足
  9. 荔枝服务器维护,手把手为你讲解win10系统自动维护功能管理的问题.
  10. 计算机网络10--路由冗余备份,缺省(静态)路由配置
  11. matlab解方java_matlab解方程
  12. wxpython 设置热键
  13. Edge浏览器在新标签页打开链接(操作方法)
  14. 时间序列常见模型介绍与实战(SPSS)
  15. MySQL中利用经纬度计算两点之间的距离
  16. 代码审计:企业级web代码安全架构读书笔记(一)
  17. 企业级硬盘产品这么多,到底该选哪一个?
  18. 知行大数据分析平台需求说明
  19. 5-10 列车调度 (25分)
  20. Git之detached HEAD

热门文章

  1. 远程连接redis遇到的一些错误解决办法JedisConnectionException:java.net.SocketTimeOutException...JedisDataException:D
  2. 控制台出现Failed to bind properties under ‘spring.datasource‘ to javax.sql.DataSource
  3. 什么叫做项目孵化_蓝莓孵化营12进5争夺战,项目人绽放自我不留遗憾
  4. java同样作用的方法_Java的接口用途和方法
  5. mysql初体验学习笔记_【MySQL】mycli初体验
  6. mac玩rust用什么画质_Mac上的活动监视器到底有什么用?你会用么?
  7. 10 - java 权限修饰符
  8. Java 线程状态流转
  9. ul 原点显示_web前端开发学习教程,CSS HTML - ul li列表原点如何相连
  10. SQL关联查询————LEFT JOIN关键字的使用