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 相关文章推荐
Python全局变量操作详解
Apr 14 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
itchat接口使用示例
Oct 23 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
Python中新式类与经典类的区别详析
Jul 10 Python
pandas to_excel 添加颜色操作
Jul 14 Python
Python实现Kerberos用户的增删改查操作
Dec 14 Python
Python类型转换的魔术方法详解
Dec 23 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
python编程项目中线上问题排查与解决
Nov 01 Python
Elasticsearch 基本查询和组合查询
Apr 19 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
PHP系统命令函数使用分析
2013/07/05 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
Python yield 小结和实例
2014/04/25 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
浅谈Python中的bs4基础
2018/10/21 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
团支部书记竞选稿
2015/11/21 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android