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编程过程中用单元测试法调试代码的介绍
Apr 02 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
Django 源码WSGI剖析过程详解
Aug 05 Python
python中自带的三个装饰器的实现
Nov 08 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
django 模型中的计算字段实例
May 19 Python
Python调用Redis的示例代码
Nov 24 Python
两行代码解决Jupyter Notebook中文不能显示的问题
Apr 24 Python
Python正则表达式中flags参数的实例详解
Apr 01 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 CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
jQuery中库的引用方法
2018/01/06 jQuery
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python3.x上post发送json数据
2018/03/04 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
中医临床专业自我鉴定范文
2014/01/15 职场文书
校园安全检查制度
2014/02/03 职场文书
女娲补天教学反思
2014/02/05 职场文书
计算机专业自荐信
2014/05/24 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
毕业生政审意见范文
2015/06/04 职场文书
Python竟然能剪辑视频
2021/05/25 Python
python通过函数名调用函数的几种方法总结
2021/06/07 Python