文章标签 ‘python’
python 编写server的步骤:
第一步是创建socket对象。调用socket构造函数。如:
socket = socket.socket( family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:
socket.bind( address )
由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
第三步是使用socket套接字的listen方法接收连接请求。
socket.listen( backlog )
backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
connection, address = socket.accept()
调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
传输结束,服务器调用socket的close方法关闭连接。
python编写client的步骤:
创建一个socket以连接服务器:socket = socket.socket( family, type )
使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
socket.connect( (host,port) )
host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
处理阶段,客户和服务器将通过send方法和recv方法通信。
传输结束,客户通过调用socket的close方法关闭连接。
下面给个简单的例子:
server.py
python 代码
1234567891011121314151617if __name__ == ‘__main__’:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((’localhost’, 8001))
sock.listen(5) [...]
前一篇文章写的在APACHE安装MOD_PYTHON的经过,其实挺简单,就是版本不兼容的问题.这次我大概说下部署DJANGO的过程.
先修改APACHE配置文件,使其加载mod_python模块
LoadModule python_module libexec/mod_python.so
运行命令查看
bin/httpd -M可以看到
python_module (shared)
Syntax OK
说明apache已经成功加载mod_python.
下面我说下我的实际的环境和项目情况:
/infoware/xx/web是django程序目录
/infoware/_conf/xx/是控制django的程序还有一些配置(有些配置变量没有写在settings),这一步可以不需要,因为大多数人会直接配置settings文件的.我是在虚拟主机上操作.
–CENTOS5.2+APACHE2.2.11+PYTHON 2.4.3+MOD_PYTHON3.3.1+DJANGO 0.96
下面是apache配置文件
—————————————————-
<VirtualHost *:80>
ServerAdmin webmaster@xxcom
DocumentRoot “/infoware/xx/web”
ServerName www1.xx.com
ServerAlias www1.xx.com
ErrorLog “/var/log/apache/xx/xx_error_log”
CustomLog “/var/log/apache/xx/xx_access_log” common
<Directory “/infoware/xx/web”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Location “/”>
SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath “['/infoware/xx/web']+['/infoware/_conf/xx] + sys.path”
SetEnv DJANGO_SETTINGS_MODULE settings
SetEnv PYTHON_EGG_CACHE /tmp/cucrm//这儿是加个变量,会在下面说明
PythonDebug On
</Location>
</VirtualHost>
——————————————————————
以上配置一定要注意环境变量的配置,否则会出错!
我在配置前出现了以下错误,##################################################################
Can’t extract [...]
安装mysqldb-python,环境是要DJANGO支持MYSQL数据库,得安装这个插件。下载了EGG文件,执行easy_install MYSQLDBxxxxx.egg提示错误:
##############################
/usr/bin/ld: cannot find -lmysqlclient_r
###############################
以为是库找不到,后来编辑/etc/ld.so.conf文件将MYSQL库和头文件加进去,ldconfig执行后还是一样,后为看了一下README,老发现需要配置SITE。CFG文件,将threadsafe选项设置成false,后正常。。
分享收藏
