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 numpy.array()生成相同元素数组的示例
Nov 12 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
将python文件打包成EXE应用程序的方法
May 22 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
wxPython实现分隔窗口
Nov 19 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python 制作python包,封装成可用模块教程
Jul 13 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如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP页面中文乱码分析
2013/10/29 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
10条php编程小技巧
2015/07/07 PHP
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
详解python对象之间的交互
2020/09/29 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
高中英语教学反思
2014/02/04 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
二手房购房协议书范本
2014/10/05 职场文书
消防安全主题班会
2015/08/12 职场文书