python基于socket实现的UDP及TCP通讯功能示例


Posted in Python onNovember 01, 2019

本文实例讲述了python基于socket实现的UDP及TCP通讯功能。分享给大家供大家参考,具体如下:

Server:

import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)
while True:
  data, addr = s.recvfrom(2048)
  if not data:
    print "client has exist"
    break
  print "received:", data, "from", addr
s.close()

Client:

import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
  msg = raw_input()
  if not msg:
    break
  s.sendto(msg, address)
s.close()

运行结果:

server

[work@db-testing python]$ python udp_ss.py
received: aaaaaa from ('127.0.0.1', 10169)
received: 123456 from ('127.0.0.1', 10169)
received: abcdef from ('127.0.0.1', 10169)

client

[work@db-testing python]$ python udp_cc.py
aaaaaa
123456
abcdef
[work@db-testing python]$

前言

python实在是太方便,太易用了,三方库的支持又全,语法又简单,对开发人员来说,实在是居家旅行,XXXX的必备利器。周末研究了下python的网络支持,做一下记录,以备随后翻阅。

python支持BSD的socket进行网络编程,其API跟C中的大同小异,先看看TCP方式的,说到网络编程,肯定会设计到server和client,分别来看下

TCP方式

server端

server端的socket一般流程是这样:

  1. 建立一个socket(可以选择socket类型INET,UNIX等,以及连接方式TCP/UDP)
  2. 使用bind公开一个端口,使得client可以方便连接
  3. 设置一个listen队列的大小
  4. 进入一个无限循环,在此无限循环中,使用accept函数来等待客户连接,此函数返回一个新的socket, 对应于客户端的socket,建立通信信道。对socket的处理一般放在外部单独的函数中(并发)
  5. 通过send()/recv()来对socket进行读写操作

好了,下面看一下例子:

netserver.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    sock.listen(5)
    while True:
      clientSock, (remoteHost, remotePort) = sock.accept()
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      revcData = clientSock.recv(1024)
      sendDataLen = clientSock.send("this is send data from server")
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
      clientSock.close()
if __name__ == "__main__":
  netServer = NetServer()
  netServer.tcpServer()

client端

  1. 建立一个新的socket
  2. 使用connect函数与远程主机获得连接
  3. 在此socket上进行I/O操作

netclient.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSock.connect(('localhost', 9527))
    sendDataLen = clientSock.send("this is send data from client")
    recvData = clientSock.recv(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  netClient = NetClient()
  netClient.tcpclient()

运行结果:

1) 先启动 netserver.py, 然后启动 netclient.py,注意client先发送后接收,server是先接收后发送,顺序要交错

2) server 打印结果:

[127.0.0.1:55279] connect
revcData:  this is send data from client
sendDataLen:  30

3) client 打印结果:

sendDataLen:  29
recvData:  this is send  data from server

由代码量可见python之简单,想要将这个例子改造成一个文件传输器,估计只需要增加不到20行代码即可。

UDP方式

UDP号称无连接传输,全然没有TCP那么复杂,三次握手,错误重传之类的机制都没有,发的只管发,收得只管收,收到没有?不知道,顺序不对怎么办?不管!就是这样,但是速度就要比TCP高得多了。在对数据帧要求不是很高的地方,这确实是很好用的,比如网络上的视频传输,音频传输等。

server端

  1. 建立数据报形式的socket
  2. 公开一个端口,一边客户端连接
  3. 开始接收数据

udpserver.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    while True:
      revcData, (remoteHost, remotePort) = sock.recvfrom(1024)
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      sendDataLen = sock.sendto("this is send data from server", (remoteHost, remotePort))
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
    sock.close()
if __name__ == "__main__":
  udpServer = UdpServer()
  udpServer.tcpServer()

需要注意的是,server中address元组中的引号表示可以接受任何地址来的数据报,TCP例子中的则表示可以接受任意地址发起的连接。

client端

  1. 新建一个数据报socket
  2. 收发数据

udpclient.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sendDataLen = clientSock.sendto("this is send data from client", ('localhost', 9527))
    recvData = clientSock.recvfrom(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  udpClient = UdpClient()
  udpClient.tcpclient()

运行结果:

1) 先启动 udpserver.py,然后启动 udpclient.py,并且保证client先发后收,server先收后发

2) server 结果(client 连续发送了三次请求):

[127.0.0.1:37219] connect
revcData:  this is send data from client
sendDataLen:  30
[127.0.0.1:57622] connect
revcData:  this is send data from client
sendDataLen:  30
[127.0.0.1:52290] connect
revcData:  this is send data from client
sendDataLen:  30

3) client 结果:

sendDataLen:  29
recvData:  ('this is send  data from server', ('127.0.0.1', 9527))

文中给出的例子已经具有网络程序的基本结构,在实际应用中,应该自行扩展对socket的处理,socket说到底跟文件句柄,文件描述符,管道描述符等都是一个概念,可以对其进行I/O处理,事实上,在UNIX类系统中,对socket的操作跟对文件句柄的操作没有任何形式上的差异。

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
基于python实现获取网页图片过程解析
May 11 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 Python
Python爬虫基础讲解之请求
May 13 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
python中time库的实例使用方法
Oct 31 #Python
Django实现分页显示效果
Oct 31 #Python
Django实现基于类的分页功能
Oct 31 #Python
python Django框架实现web端分页呈现数据
Oct 31 #Python
python3常用的数据清洗方法(小结)
Oct 31 #Python
Django实现网页分页功能
Oct 31 #Python
8段用于数据清洗Python代码(小结)
Oct 31 #Python
You might like
自己动手做一个SQL解释器
2006/10/09 PHP
目录,文件操作详谈―PHP
2006/11/25 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
接收键盘指令的脚本
2006/06/26 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python模块WSGI使用详解
2018/02/02 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
个人收入证明范本
2014/01/12 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
董事长秘书工作总结
2015/08/14 职场文书
教你部署vue项目到docker
2022/04/05 Vue.js