python网络编程socket实现服务端、客户端操作详解
作者:随风行云 发布时间:2022-11-28 14:23:20
本文实例讲述了python网络编程socket实现服务端、客户端操作。分享给大家供大家参考,具体如下:
本文内容:
socket介绍
TCP:
服务端
客户端
UDP:
服务端
客户端
首发时间:2018-02-08 01:14
修改:
2018-03-20 :重置了布局,增加了UDP
什么是socket:
socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
socket就像电话线插口,只有电话线插上了,才能通信。
python中使用socket来进行网络连接传输
TCP:
服务端:
TCP服务端一般需要下面几个操作:建立,绑定IP地址和端口,监听端口,等待连接,接收数据,传输数据 ,关闭连接
import socketserver=socket.socket()#建立socketserver.bind(('localhost',1234))#绑定server.listen()#监听print("开始等待。。。")conn,addr=server.accept()#接收连接print("连接成功")data=conn.recv(1024)#接收数据print(data.decode())conn.send(data)#发送数据server.close()#关闭连接print("--------------------")
#服务器端import socketserver = socket.socket()server.bind(('localhost',1234)) #绑定ip和端口server.listen(5) #监听while True: print("开始等待") conn, addr = server.accept() print(conn, addr) print("客户端连接") while True: data = conn.recv(1024) print("recv:",data) if not data: #当data=0时为真 print("连接断开...") break conn.send(data)server.close()
注:上述代码中在linux中正常运行,在windows中会报错!
如果要在windows中运行,需要捕获异常:
#服务器端import socketserver = socket.socket()server.bind(('localhost',1234)) #绑定ip和端口server.listen(5) #监听while True: print("开始等待") conn, addr = server.accept() print(conn, addr) print("客户端连接") while True: try: data = conn.recv(1024) print("recv:",data) if not data: #当data=0时为真 print("连接断开...") break conn.send(data) except ConnectionResetError as e: print(e) breakserver.close()
客户端:
TCP客户端一般需要下面几个操作:建立socket,连接远程socket,传输数据 ,接收数据,关闭连接
import socketclient=socket.socket()#建立socketclient.connect(('localhost',1234))#连接client.send("你好".encode())#发送数据data=client.recv(1024)#接收数据print(data.decode())client.close()#关闭连接
import socketclient=socket.socket()client.connect(('localhost',1234))while True: cmd=input(">>") if len(cmd)==0: continue client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode())client.close()
UDP:
服务端:
UDP服务端通常有以下几个操作:创建socket,绑定端口,传输数据,接收数据
import socketimport timeserver=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)server.bind(("localhost",1234))start_time=time.time()while True: data,addr=server.recvfrom(1024) print(data,addr) server.sendto("hello".encode(),addr) time.sleep(1) if time.time()-start_time>30: breakserver.close()
客户端:
UDP客户端通常有以下几个操作:创建socket,传输数据,接收数据
import socket,timeclient=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)addr=("localhost",1234)start_time=time.time()while True: client.sendto(time.ctime().encode(),addr) data,addr= client.recvfrom(1024) print(data) time.sleep(1) if time.time()-start_time>30: breakclient.close()
创建socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
传输数据:server.sendto(data,addr),【addr是一个元组,内容为(地址,端口)】
接收数据:data,server_addr=client.recvfrom(1024)
创建socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
绑定端口:server.bind(addr),【addr是一个元组,内容为(地址,端口)】
接收数据:data,client_addr=server.recvfrom(1024)
传输数据:server.sendto(data,client_addr)
上述代码存在一个问题:只能发送一次数据,发生完数据就会断开连接,改成可以多次发送数据,不自动断开的【前提是服务端能接收多次】:
建立:client=socket.socket()
连接:client.connect(('IP地址',端口)),其中地址和端口号是一个 tuple
传输数据:client.send(data),传输的数据必须是字节流,所以对字符串数据需要使用encode()
接收数据recv:client.recv(size),传输的数据是字节流,如果需要转成Unicode,需要使用decode()
关闭连接close:close()
上述代码存在一个问题:只能接受一次连接,连接结束后,服务端socket将关闭,更改成不立即关闭能等待下一个连接的:
建立:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 【参数默认就是socket.AF_INET, socket.SOCK_STREAM】
绑定端口:server.bind(('IP地址',端口)),【地址和端口号是一个 tuple 】
监听:server.listen()
接受连接: conn,addr=server.accept(),返回值是一个连接实例和一个地址,地址是连接过来的客户端地址,而数据操作要利用这个连接实例
传输数据:conn.send(data),【传输的数据必须是字节流,所以对字符串数据需要使用encode() 】
接收数据read:conn.recv(size),【传输的数据必须是字节流,size是接收的字节数,如果需要转成Unicode,需要使用decode() 】
关闭连接close:close()
首发需要导入模块:import socket
然后创建过程在下面
如果使用socket模块来创建TCP客户端和服务端:
希望本文所述对大家Python程序设计有所帮助。
来源:https://www.cnblogs.com/progor/p/8429539.html


猜你喜欢
- 本文研究的主要是Python使用pickle模块存储数据报错解决方法,以代码的形式展示,具体如下。首先来了解下pickle模块pickle提
- 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢?
- Sqlserver 获取每组中的第一条记录在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属
- 前言这部分已经折腾我两天了,还是没有头绪,可能还会折腾更久,最后在第三天上午解决问题,在一个不起眼的地方被坑了,jQuery加载的问题。会者
- 不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的。当数据量大的时候是必须考虑的。之前
- 1、生成 servie.yaml1.1、yaml转jsonservice模板yamlapiVersion: v1kind: Servicem
- 大家可能都不大熟悉关于pdb这个模块,实际上就是python中的内置模块,主要作用于命令行调试代码,下面我们将通过是哪个小结给大家详细介绍下
- 本文代码将一些简单常用的SQL语句,拆分、封装成链式函数与终结函数,链式操作没有先后之分,实现傻瓜式mysql数据库操作。 同时学习下静态成
- OS库提供通用的,基本的操作系统交互功能。-OS库是Python标准库,包含几百个函数-常用路径操作,进程管理,环境参数等几类-路径操作:
- 转自: http://www.qqread.com/mysql/z442108305.html对于程序开发人员而言,目前使用最流行的两种后台
- picker-view 相关文章:微信小程序 Button 微信小程序 radio 微信小程序 slider 微信小程序 switch微信小
- 本文实例讲述了Django开发的简易留言板。分享给大家供大家参考,具体如下:Django在线留言板小练习环境ubuntu16.04 + py
- 需求我在最近的一个任务中,存在一个redis高并发计算多个客户端接收预警信息的时长问题。模型是首先模拟多个客户端连接预警服务器集群,然后向预
- 我们经常遇到各种字典套字典的数据,例如:nest_dict = { 'a': 1, 'b
- 先推荐一个学习python的好网址简明 Python 教程 Swaroop, C. H. 著 沈洁元 译在线教程的网址
- 问题描述前端 vue 框架,后台 php,百度跨域问题后台加这段代码header("Access-Control-Allow-Or
- 之前一直使用的是MySQL5.7,但由于MySQL增加了一些新特性,所以选择了更新。下载MySQL进入MySQL官网下载地址,选择Windo
- 前言最近在用python写一个项目,发现一个很恶心的bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解。后来联想到
- 现在使用Vscode编码的人越来越多,凭借着免费,开源,轻量,跨平台的特点收货了一大批忠实粉丝最近因项目需要开始使用
- 在blueidea上看到movoin转的一个动态加载include文件代码,接着dnawo又修改了下,我用了dnawo修改后的版本,感觉挺好