#############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核心编程》

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

  1. python爬取b站视频封面_学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面...

    学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面 import os import requests import re import json from bs4 import B ...

  2. python怎么测试opencv安装是否成功_学习笔记:自己编译安装OpenCV+测试opencv安装是否成功...

    跟着猿人学python,我的学习笔记.本次的配置在ubuntu中成功安装了opencv,并通过以下方法测试成功了.现将具体的安装及测试过程整理出来分享给大家. 1. 安装编译依赖的软件包 # 安装读写 ...

  3. 在python中len表示的数据类型是_Python学习笔记——Python数据类型

    1.列表1.1取单个值 1.2切片获取子列表 1.3用len()函数获取列表长度 1.4列表的循环 1.5列表的链接和复制 1.6列表的增.删.查 1.7列表的排序--sort()方法 2.字符串2. ...

  4. java extern的作用_学习笔记之20-static和extern关键字2-对变量的作用

    上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...

  5. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  6. python中ifelifelse用在什么结构_详解Python if-elif-else知识点

    有的时候,一个 if - else - 还不够用.比如,根据年龄的划分:条件1:18岁或以上:adult 条件2:6岁或以上:teenager 条件3:6岁以下:kid Python if-elif- ...

  7. DHCP服务_学习笔记

    DHCP服务_学习笔记 DHCP(Dynamic Host Configuration Protocol):动态主机配置协议 Lease:租约    续租时间需要是租期时间的一半 UDP协议: Ser ...

  8. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章) python常用的IDE: Windows: IDLE(gui), Eclipse+PyDev; Python(comman ...

  9. 【字源大挪移—读书笔记】 第三部分:字尾

    [字源大挪移-读书笔记] 第三部分:字尾 [3 字尾:[3.1]名词字尾.[3.2]形容词字尾.[3.3]副词字尾.[3.4]动词字尾 [3.1]名词字尾(Noun) [3.1.1]表示[人]的字尾 ...

  10. db4o_8.0对象数据库官方文档翻译_学习笔记三

    紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not  ...

最新文章

  1. 厦门口岸检出今年首例登革热病例
  2. 人民大学云计算编程的网上评估平台--解题报告 1001-1003
  3. 【Apache】Apache的安装和配置
  4. android o 小米note 3,小米 Note 3 MIUI 10 安卓 8.0 内测开启
  5. 2021-04-09 linux的shell脚本简单教程
  6. 线程池简单实现java_简单实现java线程池
  7. win7在未关闭vmware情况下直接关机,导致虚拟机无法克隆
  8. python 用if判断一个数是不是整数_Python基础教程07-函数和模块的使用
  9. activity任意节点跳转
  10. visual studio 2017 3月7日正式发布,同时庆祝visual Studio 20周年
  11. Optional的巧用
  12. git版本库的创建和yaf框架环境的部署
  13. VB 游戏外挂操作类
  14. VC中利用ADO共同实现数据库的操作
  15. 系统学习NLP(二十九)--BERT
  16. testcookie-nginx-module
  17. 鸡啄米VS2010/MFC编程入门教程系列
  18. 职业生涯规划访谈记录关于计算机专业,计算机专业职业生涯规划书
  19. OSPF状态切换以及包内容的交互,以及如何根据LSDB还原单区域拓扑
  20. 一份比较实用的Ubuntu下替代WIN软件列表

热门文章

  1. 一文看懂https如何保证数据传输的安全性的
  2. SQL优化常用方法10
  3. drupal 6.0 入门教程
  4. 求助 windows server2008密码策略修改
  5. 如何保护企业网络免受勒索软件攻击 Vecloud微云
  6. Vue前端-Flask后台跨域访问问题的处理
  7. Python批量剪裁图片
  8. Apache动态编译安装模块mod_rewrite
  9. Java注解(Annotation)详解
  10. 转载 详解go语言GC