python套接字socket的作用_【学习笔记】python实现的套接字socket

#############2014.5.13 update##############

#更新了多进程服务端的bug:客户端强行关闭会出错#

#########################################

之前说要学学python,认真看看《python核心编程》这本书,因为当时手头上的工作还没结束,也就没有怎么去看,这两天刚好赶上五一,便有了几天时间来看一下。

在了解了基本语法之后,我还是比较偏向于从网络编程作为切入点来进一步学习一门语言。所以今天就写一写简单的socket套结字的实现。

先来客户端的代码,因为之后服务端会有一些改进(SocketServer模块),而客户端基本就这样了:)

作用:从键盘接收字符串并发给服务端,然后接收服务器发来的带时间戳的回执。

客户端代码

#!/usr/bin/env python

#coding=utf-8

#

# Author:xusongqi@live.com

#

# Created Time: 2014年04月30日 星期三 13时19分56秒

#

# FileName: tcp_sock_client.py

#

# Description: 单线程tcp套结字客户端

from socket import *

HOST = 'localhost'#主机名

PORT = 21567#端口号,显然要和客户端的端口号保持一致

BUFSIZ = 1024#缓冲区大小设为1K

ADDR = (HOST, PORT)#地址为主机名和端口号组成的元组

tcp_sock_client = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM即选择连接为tcp

tcp_sock_client.connect(ADDR)#使用connect函数进行连接

#循环发送与接收,从这句话看这个套结字是个长连接

while True:

data = raw_input('>')

if not data:#如果没有写入数据,跳出循环并断开连接

break

tcp_sock_client.send(data)#将数据发送到服务端

data = tcp_sock_client.recv(BUFSIZ)#接收从服务器发来的带时间戳的返回信息

if not data:#如果从服务器收到的信息为空:跳出循环并断开连接

break

print data#打印服务器发来的信息

tcp_sock_client.close()#断开连接

阻塞式单线程的服务端

然后是服务端的,嗯,这是最简单的一个服务端,前几天写的。

#!/usr/bin/env python

#coding=utf-8

#

# Author:xusongqi@live.com

#

# Created Time: 2014年04月21日 星期一 11时59分44秒

#

# FileName: tcp_sock_server.py

#

# Description: 单线程tcp套结字服务端

from socket import *

from time import ctime

HOST = ''#主机名为空,表示bind()可以绑定在所有的有效地址上

PORT = 21567#端口号要和客户端一样

BUFSIZ = 1024#缓冲区,此处设为和客户端一样大小

ADDR = (HOST, PORT)#地址元组

tcp_sock_server = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM:使用tcp协议

tcp_sock_server.bind(ADDR)#bind()绑定地址元组,当前为绑定端口21567,允许所有访问该端口的主机访问服务端

tcp_sock_server.listen(5)#listen方法的参数指定了最大连接数

while True:#开启服务器

print 'waiting for connection...'#启动反馈

tcp_sock_client, addr = tcp_sock_server.accept()#新的描述符接收来访的客户

print '...connection from:',addr#接收反馈

while True:#死循环代表了长连接

data = tcp_sock_client.recv(BUFSIZ)#接收客户端信息

if not data:#为空则断开

break

tcp_sock_client.send('[%s]%s' % (ctime(), data))#返回带时间戳的回执

tcp_sock_client.close()#关闭客户端描述符

tcp_sock_server.close()#关闭服务端描述符

好了,现在我们有了比较简单的一对套接字,但是看起来弱爆了,因为它同时只支持一个用户的访问,并且还是阻塞式的.....

那么我们现在给它加点料~改成支持多用户同时访问的如何?这个看起来不错。如果要支持多个用户的同时访问,就需要使用系统函数fork(),它被包含在os包里。

先上一个简单的调用fork的例子:

#!/usr/bin/env python

import os

from time import sleep

pid=os.fork()

if not pid:

sleep(2)

print "world"

else:

print "hello"

sleep(3)

这个程序会fork一个子进程(pid返回0),然后父进程会打印hello并睡3秒,与此同时子进程会睡2秒然后打印world,于是屏幕上出现:"hello world"。

好了有了fork函数我们就能写出支持多用户的具有多进程的服务端了,now,begin~

#!/usr/bin/env python

#coding=utf-8

#

# Author:xusongqi@live.com

#

# Created Time: 2014年04月30日 星期三 14时42分03秒

#

# FileName: tcp_sock_server_multi_thread.py

#

# Description:

from socket import *

from time import ctime

import os

import sys

HOST = ''#主机名为空,表示bind()可以绑定在所有的有效地址上

PORT = 21567#端口号要和客户端一样

BUFSIZ = 1024#缓冲区,此处设为和客户端一样大小

ADDR = (HOST, PORT)#地址元组

tcp_sock_server = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM:使用tcp协议

tcp_sock_server.bind(ADDR)#bind()绑定地址元组,当前为绑定端口21567,允许所有访问该端口的主机访问服务端

tcp_sock_server.listen(5)#listen方法的参数指定了最大连接数

"""开启服务器"""

while True:

print 'waiting for connection...'#启动反馈

tcp_sock_client, addr = tcp_sock_server.accept()#新的描述符接收来访的客户

print '...connection from:',addr#接收反馈

"""fork子进程"""

pid = os.fork()

if not pid:#pid=0:子进程

while True:#死循环代表了长连接

tcp_sock_server.close()#关闭服务端描述符

data = tcp_sock_client.recv(BUFSIZ)#接收客户端信息

if not data:#为空则断开

break

tcp_sock_client.send('[%s]%s' % (ctime(), data))#返回带时间戳的回执

tcp_sock_client.close()#关闭客户端描述符

sys.exit(0)

else

tcp_sock_client.close()#关闭客户端描述符

参考资料:

《python核心编程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值