python tcp不用循环监听_网络编程: TCP
1. IP 地址
概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址)
表现形式:
ipv4
目前主要使用的, 点分十进制的格式,(192.168.3.43)- 分为 4 段, 每段的范围是
0-255
,0.0.0.0 ~ 255.255.255.255
- 公网 IP, 可以直接被别人使用访问的 ip(需要购买)
- 局域网 ip(内网), 通过路由器或者交换机得到的 ip 都是局域网 ip, 只有处于同一个局域网的才能使用这个 ip, 电脑中查看到的 ip 都是局域网 ip.
- 分为 4 段, 每段的范围是
ipv6
冒号 16 进程的格式
作用: IP地址可以标识网络中唯一的一台设备
查看 IP 地址
- Linux 和 Mac :
ifconfig
- Windows :
ipconfig
查看网络是否正常ping
ping 公网 ip
是否可以联外网,ping www.baidu.con
ping 局域网的 ip
检查是否在同一个局域网,设备是否连通
域名: 是 ip 地址的别名, 方便记忆, (DNS 服务器, 将域名转换为 ip 地址)
127.0.0.1
本机的 ip 地址, 对应的域名localhost
2. 端口
端口: 数据传输的通道
端口号: 是端口的唯一标识, 是一个整型数字(int)
端口的分类0-65535
一共 65536个
- 知名端口
0-1023
- http 协议
80
- https :
443
- ssh
22
- http 协议
- 动态端口
1024-65535
通过 ip 找到某台主机, 设备
通过端口号,能对应主机中的一个应用程序
IP + 端口: 标识网络中唯一的一个应用程序
3. TCP
概念: 传输控制协议(主机间通信传输数据的规则)
特点:
- 面向连接的(通信之前, 必须先建立连接)
- 数据是可靠的
- 发送应答
- 超时重传
- 错误校验
- 流量控制
通信步骤:
- 建立连接
- 传输数据(通信)
- 关闭连接
传输协议: TCP UDP
4. scoket
- socket, 套接字, 进程间网络通信的工具.
- 使用场景: 所有的网络通信的底层都会使用 socket
5. TCP 客户端
# 1. 创建 socket 对象 socket.socket()
# 2. 和服务器建立连接 socket对象.connect()
# 3. 发送数据给服务器 socket对象.send()
# 4. 客户端接收服务器发送的信息 socket对象.recv()
# 5. 关闭连接 socket对象.close()
# (3. 4 可以重复进行)
python 中的字符串
str: 使用引号引起来的就是字符串
bytes: 二进制类型的数据
str --> bytes str.encode(编码类型)
bytes--> str bytes.decode(编码类型)
程序代码:
import socket
# 1. 创建 socket 对象
# socket.AF_INET 表示 ipv4 AF_INET6 表示 ipv6
# socket.SOCK_STREAM 表示 tcp协议
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 和服务器建立连接(参数是元组)
client_socket.connect(('192.168.1.5', 8080))
print('和服务器建立连接成功')
# 3. 发送数据给服务器
# 3.1 准备数据(bytes)
send_info = '你好服务器'.encode()
# 3.2 发送数据
client_socket.send(send_info)
# 4. 客户端接收服务器发送的信息,参数表示一次接收多少字节
buf = client_socket.recv(4096)
try:print(f'接收到: {buf.decode()}')
except UnicodeError:print(f'接收到: {buf.decode("gbk")}')
# 5. 关闭连接
client_socket.close()
程序输出:
和服务器建立连接成功
接收到: 你好
注意点:
- 必须先启动服务器
- connect 是元组类型, 服务器的 ip 和端口不要写错
6. TCP 服务端
# 1. 创建 socket 对象
# 2. 绑定 IP 和端口
# 3. 设置监听, 将主动套接字变为被动套接字
# 4. 等待客户端链接阻塞等待
# 5. 接收客户端的信息
# 6. 给客户端发送信息
# 7. 关闭套接字
程序代码:
import socket
# 1. 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定 IP 和端口(参数是元组)
server_socket.bind(('', 9999)) # IP 地址为空表示绑定的是王机中任意一个ip
# 3. 设置监听, 将主动套接字变为被动套接字,参数表示最多允许多少客户端同时请求服务器(不包括已经连接成功的)
server_socket.listen(128)
# 4. 等待客户端链接阻塞等待
print('等待客户端连接')
# 返回值是元组类型(用于通信socket,客户端的 IP 和端口
new_socket, ip_port = server_socket.accept()
print(f'客户端 {ip_port} 上线')
# 5. 接收客户端的信息
buf = new_socket.recv(4096)
print(f'接收到: {buf.decode()}')
# 6. 给客户端发送信息
new_socket.send('信息收到'.encode())
# 7. 关闭套接字
new_socket.close()
server_socket.close()
程序输出:
等待客户端连接
客户端 ('192.168.1.5', 65439) 上线
接收到: 你好服务器
设置端口复用:
# 参数1 level,设置哪个级别的socket, socket.SOL_SOCKET当前的socket(固定写法)
# 参数2 option, 设置什么内容, socket.SO_REUSEADDR 端口复用
# 参数3 将内容设置为什么值, True
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
判断客户端断开连接:
# buf: 字符串(容器)都可以直接作为 bool 类型进行判断,当容器中元素的个数为 0, 是 False, 其余是 True
if len(buf) == 0:pass
if buf: # if not buf:pass
7. 多任务 TCP 服务端
程序代码:
import socket
import threadingdef handle_client_request(new_socket, ip_port):while True:buf = new_socket.recv(4096)if buf:try:print(f'接收到: {buf.decode()}')new_socket.send('信息收到'.encode())except UnicodeDecodeError:print(f'接收到: {buf.decode("gbk")}')new_socket.send('信息收到'.encode("gbk"))else:print(f'{ip_port} 下线')breaknew_socket.close()if __name__ == '__main__':# 1. 创建 socket 对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2. 绑定server_socket.bind(('', 9999))# 3. 设置监听server_socket.listen(128)# 4. 循环等待客户端链接阻塞等待print('等待客户端连接')while True:# 返回值是元组类型,(用于通信socket,客户端的Lio和端口port】,拆包new_socket, ip_port = server_socket.accept()print(f'客户端 {ip_port} 上线')sub_thread = threading.Thread(target=handle_client_request, args=(new_socket, ip_port))sub_thread.start()
注意:
- 线程要启动 start()
- new_socket.close() 位置要正确
python tcp不用循环监听_网络编程: TCP相关推荐
- Libevent实现TCP服务循环监听
目标 建立一个简单的tcp服务,可持续的监听客户端的连接和请求 细节 libevent stream socket EV_READ | EV_PERSIST 代码 要义libevent对stream_ ...
- 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议
在Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP.UDP协议属于传输层. IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. TCP协议是 ...
- 多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...
# 网络编程 # 计算机网络, 把多台独立自主的计算机,连接到网络,实现资源的共享 # Internet网,(互联网)eniac 1946美国大学第一台电子计算机 # # 一个TCP报文除了包含要传输 ...
- tcp丢包率_网络编程 | TCP/IP基础知识
在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的<热血暗黑>时就被深深地震撼到 ...
- Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【多线程+循环监听】
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- linux netstat Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
在Internet RFC标准中,Netstat的定义是: Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告. Netstat ...
- Python网络编程——TCP与UDP
Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...
- Socket编程(C语言实现)——UDP协议(进程间通信AF_UNIX)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【循环监听】
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- linux listen监听,Linux网络协议栈 -- socket listen监听
一.sys_listen 对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog); ...
最新文章
- oracle十六进制转数字,16进制如何转化为10进制?
- HDU 2079 选课时间
- linux虚拟网络设备之tun/tap驱动程序设计原理(五)
- MySQL批量更新死锁案例分析--转载
- 6.19决战光荣日,一场魔兽狂欢里的青春、父爱和友谊
- Maven修改远程仓库配置
- Codeforces 712C. Memory and De-Evolution
- 《穿靴子的猫》蓝光720P 1080P高清中英双字 下载
- Docker CEO Ben Golub:Docker借助开源、天时走向成功
- 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放
- conky的自动启动
- 欧科云链OKLink:以太坊上借贷协议借款量突破百亿美元
- 经过多次试验后第一个成功地实现 HTTPService 与 MXML 之间传递数据,ArrayCollection 与DataGrid 之间成功绑定...
- http中url的长度限制
- Redis 官方推出可视化工具,颜值爆表,功能真心强大!这是不给其他工具活路啊!...
- css手指代码,CSS3动画:通过Animation实现简单的手指点击动画
- 启用视口着色:在视图窗口实时显示灯光照明效果_daiding
- windows PE结构解析
- 相机外部参数—世界坐标、相机坐标、物体坐标变换
- 利用R语言ggplot2包制作金字塔图,展示人口结构数据