Python基础系列讲解——TCP协议的socket编程
前言
我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP协议通讯。那么网络通讯方面都会涉及到socket编程,当然也包括TCP协议。Python作为一门适应于快速开发的工具,在它浩瀚的第三方库中也一定包括了socket模块,那么本文就给大家介绍Python的socket编程实现TCP协议连接的方法。
socket介绍
socket(套接字)起源于UNIX,主要用于网络进程间通讯,它是在应用层和传输层之间的一个软件抽象层,它把TCP/IP复杂的操作抽象为几个简单的接口供应用层调用来实现进程在网络中的通信。因为在Unix中一切皆为文件,所以socket通过"open—read/write—close"模式来实现进程在网络中的通信。服务器和客户端各自维护一个"文件",建立连接后相当于打开了文件,各自可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时则关闭文件。
TCP连接流程
socket主要以"open—read/write—close"的模式来实现客户端和服务器之间TCP协议的连接,交互流程如下图所示。TCP服务器的建立可以归纳这几步:1)创建socket(套接字);2)绑定socket的ip地址和端口;3)监听客户端的连接请求;4)接受客户端的连接请求;5)与客户端对话;6)关闭连接。TCP客户端的创建可总结为这几步:1)创建socket(套接字);2)连接服务器socket;3)与服务器对话;4)关闭连接。厦门叉车出租电话是多少
需要注意的是TCP客户端连接到服务器的ip和端口要与TCP服务器监听的ip和端口相同,服务器调用listen()开始监听端口,而后调用accept()时刻准备接受客户端的连接请求,此时服务器处于阻塞状态,直到服务器监听到客户端的请求后,接收请求并建立连接为止。
TCP服务器/客户端例程
提供给大家两个Python实现socket连接例程,一个为TCP服务器和客户端的短连接例程,即服务器接受客户端连接后创建一个线程,在线程中与客户端收发数据后关闭连接,另一个为TCP服务器和客户端的长连接例程,服务器与客户端建立连接后彼此循环收发数据,不关闭连接。
这里要注意的是服务器接收客户端发送数据时是处于阻塞状态的。server.close()是关闭服务端的socket程序本身的连接,关闭后整个服务端socket程序就退出运行。client_socket.close()是关闭服务端socket程序与客户端的连接,关闭后服务端的socket程序仍然还在运行。
TCP服务器短连接实现
import socket
import threading
bind_ip = "127.0.0.1"
bind_port = 12345
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))#bind ip and port
server.listen(5)#start listen max connection
print "[*] listening on %s:%d" % (bind_ip, bind_port)
def handle_client(client_socket):
request = client_socket.recv(1024)
print "[*] Received: %s" % request
client_socket.send('ACK!')
client_socket.close()
while True:
client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
client_handler = threading.Thread(target=handle_client, args=(client,))
client_handler.start()
server.close()
TCP客户端短连接实现
import socket
target_host = '127.0.0.1'
target_port = 12345
#Creat socket object AF_INET means use the normod IPv4 address and hots name;OCK_STREAM one tcp client
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port))
client.send("i am TCP client")
response = client.recv(4096)
print response
TCP服务器长连接实现
import socket
import threading
bind_ip = "127.0.0.1"
bind_port = 12345
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))#bind ip and port
server.listen(5)#start listen max connection
print "[*] listening on %s:%d" % (bind_ip, bind_port)
while True:
client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
while True:
request = client.recv(1024)
print "[*] Received: %s" % request
client.send('ACK!')
print "[*] Sended: ACK!"
client.close()
server.close()
TCP客户端长连接实现
import socket
target_host = '127.0.0.1'
target_port = 12345
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port))
while True:
client.send("TCP client connect")
response = client.recv(4096)
print response
Python基础系列讲解——TCP协议的socket编程的更多相关文章
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- 基于TCP协议的socket编程
什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
- Py修行路 python基础 (二十四)socket编程
socket编程 一.客户端/服务端架构 客户端/服务端架构 即C/S架构,包括:1.硬件C/S架构,2.软件C/S架构. 互联网中处处都是C/S架构,学习socket 就是为了完成C/S架构的开发. ...
- Python基础系列讲解——random模块随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...
- Python基础系列讲解——继承派生和组合的概念剖析
Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系. 所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的 ...
- Python基础系列讲解—动态类型语言的特点
前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...
- Python基础系列讲解-自动控制windows桌面
原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...
- Python基础系列讲解——try_except异常处理机制
在Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行.比如以下例程中,使 ...
随机推荐
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
1.abstract与static what abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用. static:用来声明静态方法,静态方 ...
- 「iOS」你会用几种方法实现计时器
1.NSTimer 存在一定的误差,不管是一次性的还是周期性的timer得实际触发事件的时间,都会与所加入的runloop和runloopMode有关,如果此runloop正在执行一个连续性的运算,t ...
- OpenID Connect Core 1.0(一)介绍
IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...
- Mybatis主线流程源码解析
Mybatis的基础使用以及与Spring的相关集成在官方文档都写的非常详细,但无论我们采用xml还是注解方式在使用的过程中经常会出现各种奇怪的问题,需要花费大量的时间解决. 抽空了解一下Mybat ...
- hadoopStreamming 编程
熟悉hadoop作业提交的人,只要明白streaming的参数就可以学会提交了,streaming提交作业比较灵活,支持多种语言,但是streaming有个缺陷就是,其封装的参数涉及到mapreduc ...
- 学习笔记:Oracle的trace文件可见性
隐藏参数: _trace_files_public 参数 trace文件的默认权限: - r w - r - - - - - 如果设定 trace_files_public参数为 true, 则 t ...
- Noip前的大抱佛脚----一些思路
目录 一些思路 序列 函数问题 网格图 删除和询问 乘法问题 顺序问题 最值问题 研究成果 数论分块套数论分块的复杂度 一些思路 Tags:Noip前的大抱佛脚 序列 线段树(当然还要有主席树啊!) ...
- mfc 类的析构函数
析构函数 自定义析构函数 一.析构函数 析构函数(destructor) 与构造函数相反,当对象生命周期结束时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做“清理善 ...
- void与NULL详解
void 是 “空”类型(无值型),意思是这种类型的大小无法确定. 并不存在void类型的对象,所以也就不能声明void类型的对象或者将sizeof()运算符用于void类型,C++/C语言不能对一个 ...
- SpringCloud-客户端的负载均衡Ribbon(三)
前言:微服务架构,不可避免的存在单个微服务有多个实例,那么客户端如何将请求分摊到多个微服务的实例上呢?这里我们就需要使用负载均衡了 一.Ribbon简介 Ribbon是Netflix发布的负载均衡器, ...