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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
python 调用c语言函数的方法
Sep 29 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
wxPython色环电阻计算器
Nov 18 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
pycharm2020.2 配置使用的方法详解
Sep 16 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
介绍几个array库的新函数 php
2006/12/29 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
php while循环得到循环次数
2013/10/26 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php简单中奖算法(实例)
2017/08/15 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
numpy中的高维数组转置实例
2018/04/17 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
python配置文件写入过程详解
2019/10/19 Python
简述 Python 的类和对象
2020/08/21 Python
班组长岗位职责范本
2014/01/05 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
英语老师推荐信
2014/02/26 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
八一建军节慰问信
2015/02/14 职场文书
实习报告范文
2019/07/30 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers