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
- Linux 和 Mac :
查看网络是否正常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() 位置要正确
相关文章:

WC2018集训 吉老师的军训练
WC2018集训 吉老师的军训练 #include<bits/stdc.h> #define RG register #define IL inline #define _ 200005 #define X 100000000 #define ll unsigned long long using namespace std;IL int gi(){RG int data 0 , m 1; RG char ch 0;while(ch ! - && (ch&…

一篇文章搞定Python全部基础知识
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 前言: 1、Python软件安装 第一章、字符串及数字变量 1、变量 要点提炼:Python变量为强类型动态类型。换言之,…

Java 时间和日期类型的 Hibernate 映射
以下情况下必须显式指定 Hibernate 映射类型一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp. 此时必须根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射…

idea springmvc_SSM三大框架使用Maven快速搭建整合(SpringMVC+Spring+Mybatis)
本文介绍使用SpringMVCSpringMyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程。技术选型:SpringMVCSpringMyBatisMySqlMavenJSPIDEATomcat7JDK1.8Navicat for MySql下面开始搭建项目:一、数据库环…

欧拉函数+素数筛
欧拉函数,就是欧拉发现的一个关于求素数的的公式,然后我们编个函数实现这个公式。 欧拉发现求小于等于n的正整数中有多少个数与n互质可以用这个公式: euler(x)x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数&a…

对 Python 开发者而言,IPython 仍然是 Jupyter Notebook 的核心
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Jupyter 项目提供的魔法般的开发体验很大程度上得益于它的 IPython 基因。 最近刚刚写过我为什么觉得觉得 Jupyter 项目(特别是 Jupy…

LintCode 249. 统计前面比自己小的数的个数
给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000)。对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量。 注意事项 We suggest you finish problem Segment Tree Build, Segm…

springboot过滤器排除掉一些url_理解这9大内置过滤器,才算是精通Shiro
小Hub领读:权限框架一般都是一堆过滤器、拦截器的组合运用,在shiro中,有多少个内置的过滤器你知道吗?在哪些场景用那些过滤器,这篇文章希望你能对shiro有个新的认识!别忘了,点个 [在看] 支持一下…

安装APK,启动系统Activity
要同时设置data和type的话只能用函数setDataAndType private void installApk(File file) {Intent intent new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT"); // intent.setData(Uri.fromFile(fi…

EOS能不能囤?一篇文章搞懂EOS优缺点
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 EOS是一个基于区块链的开发平台,专为构建去中心化应用程序(dApp)而设计。EOS是一个开源项目,其源代…

JS 中的事件设计
看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong 抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享。 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式…

‘百度杯’十月场web ---login
首先一看的题,既然是是web类的,就要查看源码,一看,最先有一行注释,估摸着是用户名和密码 果然登录上去了,显示一段乱码,源码也没有什么东西, 那就抓一次包吧 发现响应头里边有个sho…

oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程
根据应用执行的3个阶段,不同执行模式下各个阶段的执行逻辑不相同,本文分析不同模式下的执行逻辑。Yarn-Client模式的执行流程Yarn的组成Yarn是hadoop自带的资源管理框架,它的设计思想是:YARN的基本思想是将资源管理和作业调度/监视…

分享EOS加拿大的文章《REX——从源代码做技术解析》
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 已提议将丢失密钥恢复系统部署到EOS主网。 丢失密钥解决方案的最后一步已经在链上提出。最后一步是将丢失密钥解决方案智能合约部署到为此目的创建…

16.QT鼠标
头文件 1 #include <QMouseEvent> 2 #include <QStatusBar> 3 #include <QLabel> 1 protected: 2 //鼠标按下 3 void mousePressEvent(QMouseEvent *e); 4 //鼠标移动 5 void mouseMoveEvent(QMouseEvent *e); 6 //鼠标释放 7 void …

c++ windows获得当前工作目录文件_基于linux下Python文件操作
Python中的文件操作1、文件的打开与关闭想一想:如果想用word编写一份简历,应该有哪些流程呢?1、打开word软件,新建一个word文件2、写入个人简历信息3、保存文件4、关闭word软件同样,在操作文件的整体过程与使用word编写…

maven 插件
maven-enforcer-plugin https://maven.apache.org/enforcer/maven-enforcer-plugin/ https://maven.apache.org/enforcer/maven-enforcer-plugin/enforce-mojo.html http://maven.apache.org/enforcer/enforcer-rules/index.html转载于:https://www.cnblogs.com/SamuelSun/p/58…

数字货币EOS半年时间暴跌90%多,还可追捧吗?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 对财富上的自由,很多人认为这比感情来得容易多了。但是面对这个竞争激烈的社会,是兢兢业业的工作,还是投资房地产…
resnet keras 结构_Wandb用起来,一行Python代码实现Keras模型可视化
大数据文摘出品来源:wandb编译:邢畅、宁静在训练神经网络的过程中,我们可能会希望可视化网络的性能和中间的结构,很多可视化代码的冗长复杂使得我们望而却步,有没有一行代码就能解决可视化的所有问题呢?通过…

tensorflow学习笔记————分类MNIST数据集
在使用tensorflow分类MNIST数据集中,最容易遇到的问题是下载MNIST样本的问题。 一般是通过使用tensorflow内置的函数进行下载和加载, from tensorflow.examples.tutorials.mnist import input_data mnist input_data.read_data_sets("MNIST_data&q…

Build SSCLI20 under VS2008 full Document (完全手册)
以前build过几次sscli2都成功了,这次换了个新的环境,没想到出了一大堆的问题。折腾了半天,最终搞定,把解决问题的过程和方法都记录下来。 首先说说build的过程中参考过的链接和资源。 首先就是sscli自带的文档:Buildin…

vue 发展历程时间轴动画_PPT时间轴如何做出创意感?海量素材免费分享,网友:收藏...
时间轴页面,是工作型PPT中常见的页面之一。个人述职或者公司介绍PPT中,使用时间轴,能够让观众更加清晰地了解公司的发展历程。但是,很多人在制作时间轴页面时,往往是这样的效果:只有几行字和一根线…

[CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数容斥原理gcd 正确做法是暴力的一种优化,ans所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y)连成的线段而言(其中a>x,b>y), 在…

石子合并[DP-N3]
题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式&…

智能合约智能么?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 近几年,随着区块链、加密货币概念的发展,智能合约也开始被广泛的接受,然而就像最初的人工智能被过度神化一样&…

Codeforces 504 A (Round #285 div.1 A) Misha and Forest
Codeforces Round #285 (Div.1) A Misha and Forest 水题水题水…… 题意:给你一些点,给出他们连通了多少个点以及这些点的下标的异或值,让你找出一个图 题解:拓扑排序一发 代码: #include <iostream> #include <cstdio&…

hashlib模式和hmac模式
hashlib模式 什么叫hash? 一:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash…

asp导出word中文乱码_解决文档打开乱码问题丨小工具系列
问题:手头上有个从Workbench导出的数据表文档打开发现里面的中文是乱码!如图所示:解决方法利用记事本(notepad)将该文档的格式修改为UTF-8,步骤如下点击电脑的开始菜单,点击"所有程序"࿰…

一篇文章让你了解智能合约以及和区块链的关系
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约是区块链最重要的特性,也是区块链能够被称为颠覆性技术的主要原因,更是各国央行考虑使用区块链技术来发行数字货币的…

我的常用npm命令
npm link gulp node-sass gulp-sass gulp-autoprefixer gulp-sourcemaps gulp-font-spider gulp-concat gulp-uglify gulp-jshint map-stream 转载于:https://www.cnblogs.com/siluo2000/p/8779988.html