Python socket编程实例详解


Posted in Python onMay 27, 2015

本文实例形式较为详细的讲述了Python socket编程。分享给大家供大家参考。具体如下:

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

上面的代码创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ip v4的类型。
socket(address_family,type,protocol_type):

上面三个参数的含义是:

address_family指明要建立哪一类socket。最常用的当然是ip协议,AF_INET。在unix系统中,AF_UNIX也是比较常用的,用于建立unix系统中的进程间通信。

type用于指定通信类型。通常是建立面向连接的流通信。SOCKET_DGRAM是报文通信。如果address_family设置的是AF_INET,那么对应的是TCP和UDP。

protocol用于指定协议类型。这个参数是可选的。在建立tcp或者是udp连接的时候他们通常都是0。如果第一个参数是AF_INET,那么这个参数表示是ip包中的protocol字段。

【UDP本来就不区分server和client。所有节点都是对等的】

第二步是将socket绑定到指定的地址:

sock.bind(('localhost',7556))

第三步是使用listen方法监听请求:【listen方法中的参数指明可接受的最大连接数】
sock.listen(5)

第四步是不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
connection,address = sock.accept()

accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。

如果send成功了,那么对方的缓冲区已经有你发送的数据了。
#调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。

connection.settimeout(5)
buf = connection.recv(1024)

具体处理如下:

if buf == '1':
  connection.send('welcome to python server!')
else:
  connection.send('please go out!')

使用send发送数据给客户端。客户端使用recv来接收数据。

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',7556))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

这就是整个通信过程了。

全部代码如下:

server端:

#!/usr/bin/env python
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('localhost',7556))
sock.listen(5)
while True:
  connection,address = sock.accept()
  print "client ip is "
  print address
  try:
    connection.settimeout(5)
    buf = connection.recv(1024)
    if buf == '1':
      connection.send('welcome to python server!')
    else:
      connection.send('please go out!')
  except socket.timeout:
    print 'time out'
  connection.close()

client端如下:

#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',7556))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

记住,socket使用完毕之后要关闭。【上面的代码,server端忘记关闭socket了】
当然,在socket连接的过程中,最好使用try except来做一下错误处理。

注意,accept函数和recv函数都是阻塞式的。也就是说,他们一直在等待,直到有客户端连接过来或者是后者的有数据可以接收。

下面是一个FTP的小例子。

使用了多线程来处理每一个请求。

示例代码点击此处本站下载。

如果传输路径不存在则建立。

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

Python 相关文章推荐
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python检测网站链接是否已存在
Apr 07 Python
python实现报表自动化详解
Nov 16 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
Python流程控制 if else实现解析
Sep 02 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
Django之form组件自动校验数据实现
Jan 14 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python实现简单反弹球游戏
Apr 12 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 Python
Python简单删除目录下文件以及文件夹的方法
May 27 #Python
python解析xml文件实例分析
May 27 #Python
Python定时执行之Timer用法示例
May 27 #Python
python定时执行指定函数的方法
May 27 #Python
python统计文本字符串里单词出现频率的方法
May 26 #Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 #Python
python使用urllib2提交http post请求的方法
May 26 #Python
You might like
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
js 与或运算符 || && 妙用
2009/12/09 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
python 多线程应用介绍
2012/12/19 Python
Python修改Excel数据的实例代码
2013/11/01 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
金融管理专业毕业生求职信
2014/03/12 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
母亲节寄语大全
2015/02/27 职场文书
七一活动主持词
2015/06/29 职场文书
婚庆主持词大全
2015/06/30 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python