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实现xml与数据库读取转换的方法
Jun 17 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
基于python实现聊天室程序
Jul 27 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
Python语言异常处理测试过程解析
Jan 08 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
python缩进长度是否统一
Aug 02 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
python办公自动化之excel的操作
May 23 Python
Python一些基本的图像操作和处理总结
Jun 23 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
php二维数组排序详解
2013/11/06 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
JSONP基础知识详解
2017/03/19 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Python中index()和seek()的用法(详解)
2017/04/27 Python
Python学习入门之区块链详解
2017/07/25 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
详解python数据结构和算法
2019/04/18 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
教师节宣传方案
2014/05/23 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
就业意向协议书
2015/01/29 职场文书