Python 的 Socket 编程


Posted in Python onMarch 24, 2015

Socket是网络应用的基础。而Python使得网络socket编程入门变得超级简单。在这篇简介里面我们将创建一个简单服务器,用于接受和相应客户端程序的请求。
由于本人最近对 Linux Containers 有点痴迷,因此我们也将在服务器中实现2个容器。同时在容器中我们在几秒钟内就能创建其他一些主机,这就能非常简单的模拟出一个网络。

创建容器

我使用的是Ubuntu14.04. 然后用root用户运行下面的命令就可以创建好2个容器了。

lxc-create -t download -n pyServer 

# Choose ubuntu, trusty, amd64 when prompted 

# Then clone the first container 

lxc-clone -o pyServer -n pyClient

启动服务器

现在我们创建好了容器,先进入到服务器容器中并启动我们的服务器程序。用root权限运行下面这条命令就可以启动容器了:lxc-start -n pyServer -d, 这将启动容器作为我们的守护进程。让我们先重新连接进入这个容器。这里我喜欢使用screen,这样我可以很方便的进出到容器中。先创建screen会话:  screen -dRR pyServer,需要重新连接到容器中的话,可以用命令:lxc-attach -n pyServer
当我们进入到容器中后,我们需要安装python并启动服务器。

apt-get install python 

vim pyServer.py

打开vim(或你个人偏好的文本编辑器),敲入以下python代码。

from socket import *

serverPort = 12000

serverSocket = socket(AF_INET, SOCK_DGRAM)

serverSocket.bind(('', serverPort))

print "The server is ready to rock and roll!"

while 1:

    name, clientAddress = serverSocket.recvfrom(2048)

    response = "Hello " + str(name) + "! You are really good at socket programming" 

    serverSocket.sendto(response, clientAddress)

这段代码很直观。我们创建了一个serverSocket监听12000端口。当接收到请求的时候(包含用户名)就会回复一条信息。启动服务器的命令是 python pyServer.py 如果一切正常的话,你应该可以看到这样一条信息 This server is ready to rock and roll! 用Ctrl+a 和Ctrl+d退出容器(还有screen会话)

启动客户端

现在服务器端已经准备就绪,改让客户端跑起来了。在开始前先查一下服务器容器的IP地址,我们马上就会用到。你可以用这个命令得到IP:lxc-ls --fancy 。用一个screen会话进入到客户端的容器,和前面步骤一样安装好python。

lxc-start -n pyClient -d

screen -dRR pyClient

lxc-attach -n pyClient

apt-get install python

vim pyClient.py

在vim里面敲入以下代码创建一个pyClient.py文件。

from socket import *

# Replace the IP address in serverName with the IP of your container that you      grabbed previously.

serverName = '10.0.3.211'

serverPort = 12000

clientSocket = socket(AF_INET, SOCK_DGRAM)

name = raw_input('Please enter your name:')

clientSocket.sendto(name, (serverName, serverPort))

response, serverAddress = clientSocket.recvfrom(2048)

print response

clientSocket.close()

这段代码也很直观。要求用户输入用户名,然后发送到服务器,最后打印出服务器响应信息。
现在你可以自己来了!保存文件,然后执行python程序 python pyClient.py .在你输入你的名字并按下回车后,就应该可以收到一条来自服务器的响应信息。
这是一个非常简单的例子,但我们很容易就发现,可以在这些基础的代码上面做一些拓展就可以实现很多更有趣也更复杂的应用。我们还可以利用LXC强大的功能但简便的操作模拟出一个更大的网络从而实现一个分布式应用。

以上所述就是本文的全部内容了,希望对大家学习python能够有所帮助。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

Python 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
Python实现图像几何变换
Jul 06 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
python 将md5转为16字节的方法
May 29 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
python基础梳理(一)(推荐)
Apr 06 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
Python如何读取文件中图片格式
Jan 13 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
教你怎么用Python操作MySql数据库
May 31 Python
python获取标准北京时间的方法
Mar 24 #Python
python实现定时同步本机与北京时间的方法
Mar 24 #Python
Python随机生成一个6位的验证码代码分享
Mar 24 #Python
python判断字符串是否包含子字符串的方法
Mar 24 #Python
python使用datetime模块计算各种时间间隔的方法
Mar 24 #Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 #Python
python读取json文件并将数据插入到mongodb的方法
Mar 23 #Python
You might like
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
php include和require的区别深入解析
2013/06/17 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP缓冲区用法总结
2016/02/14 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
2018/05/15 NodeJs
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
python机器学习实战之K均值聚类
2017/12/20 Python
python实时监控cpu小工具
2018/06/21 Python
python3.7 的新特性详解
2019/07/25 Python
python中tab键是什么意思
2020/06/18 Python
Django nginx配置实现过程详解
2020/09/10 Python
经典C++面试题一
2016/11/06 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
爱情保证书范文
2014/02/01 职场文书
房屋租赁意向书
2014/04/01 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android