文章主体现部分来自:http://openexperience.iteye.com/blog/145701

1. 背景知识

如果使用TCP协议来传递数据,客户端和服务器端需要分别经过以下步骤:

  • server: 创建socket - bind(绑定socket到指定地址) - listen(在端口监听来自客户端的连接) - accept(接受客户端的连接请求) - send(向客户端发送数据)- close(关闭此次连接)
  • client: 创建socket - connect(发出服务器连接请求)- receive(接收服务器端发来的数据)- close(关闭此次连接)

python官方关于socket的函数可参见:http://docs.python.org/library/socket.html

python 编写server的步骤:

  1. 第一步是创建socket对象。调用socket构造函数。如:
    socket = socket.socket( family, type )
    family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
    type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

  2. 第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:
    socket.bind( address )
    由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。

  3. 第三步是使用socket套接字的listen方法接收连接请求。

    socket.listen( backlog )

    backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

  4. 第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
    connection, address = socket.accept()
    调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。

  5. 第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
  6. 传输结束,服务器调用socket的close方法关闭连接。

python编写client的步骤:

  1. 创建一个socket以连接服务器:socket = socket.socket( family, type )
  2. 使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:socket.connect( (host,port) )
  3. host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
  4. 处理阶段,客户和服务器将通过send方法和recv方法通信。
  5. 传输结束,客户通过调用socket的close方法关闭连接。

2. 一个简单的编程实例

  1. #server.py
  2.  
  3. import socket
  4.  
  5. def Server():
  6. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7. sock.bind(('localhost',8080))
  8. sock.listen(1)
  9.  
  10. while True:
  11. connection, address=sock.accept()
  12. try:
  13. connection.settimeout(1)
  14. buf=connection.recv(1024)
  15. if buf=='1':
  16. connection.send('Welcome to server!')
  17. else:
  18. connection.send('Goodbye!')
  19. except socket.timeout:
  20. print 'socket timeout'
  21. connection.close()
  22.  
  23. if __name__=='__main__':
  24. Server()
  1. #client.py
  2.  
  3. import socket
  4. import time
  5.  
  6. def Client():
  7. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  8. sock.connect(('localhost',8080))
  9. time.sleep(2)
  10. sock.send('1')
  11. print sock.recv(1024)
  12. sock.close()
  13.  
  14. if __name__=='__main__':
  15. Client()

【转】使用python编写网络通信程序的更多相关文章

  1. Python编写一个程序求2的次方

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- #":"冒号后面为对参数注释,"->"为对整个函数注释 def ...

  2. python如何编写win程序

    python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...

  3. pycharm编写spark程序,导入pyspark包

    一种方法: File --> Default Setting --> 选中Project Interpreter中的一个python版本-->点击右边锯齿形图标(设置)-->选 ...

  4. 在Pycharm上编写WordCount程序

    本篇博客将给大家介绍怎么在PyCharm上编写运行WordCount程序. 第一步 下载安装PyCharm 下载Pycharm PyCharm的下载地址(Linux版本).下载完成后你将得到一个名叫: ...

  5. 基于python编写的天气抓取程序

    以前一直使用中国天气网的天气预报组件都挺好,可是自从他们升级组件后数据加载变得非常不稳定,因为JS的阻塞常常导致网站打开速度很慢.为了解决这个问题决定现学现用python编写一个抓取程序,每天定时抓取 ...

  6. 【转载】Python编写简易木马程序

    转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...

  7. 用Python编写的第一个回测程序

    用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...

  8. Python编写守护进程程序

    Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...

  9. 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试

    相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控 用python + hadoop streami ...

随机推荐

  1. 【BZOJ 2749】 2749: [HAOI2012]外星人 (数论-线性筛?类积性函数)

    2749: [HAOI2012]外星人 Description Input Output 输出test行,每行一个整数,表示答案. Sample Input 1 2 2 2 3 1 Sample Ou ...

  2. HDU5904 LCIS 水题

    http://acm.hdu.edu.cn/showproblem.php?pid=5904:// 说是LCIS其实和LCIS没有一点儿关系的水题. 代码 #include<cstdio> ...

  3. Java类实例化原理

    Java对象的创建过程包括 类初始化(JVM类加载机制)和类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 ...

  4. CXF生成调用webservice的客户端

    首先当前是从官网下载cxf组件. http://cxf.apache.org/download.html 下载后解压,在这里主要是用到解压后的bin目录中的wsdl2java.bat该批处理文件. 可 ...

  5. js中常用日期时间转换

    常用日期时间处理插件:1. timeago.js处理几分钟之前    2. day.js    3. moment.js 注意: 1. 此处的标准时间格式为  2018-03-23 13:35:47 ...

  6. 发展中的生命力——Leo鉴书69

    接触<寻路中国>是在2011年11月24号的正略读书会上.当期主讲嘉宾是万圣书园创始人刘苏里,也是著名的大书评人.读书会有个传统就是每期推荐一本书.当期推荐就是<寻路中国>.事 ...

  7. Upgrading Directly from MySQL 5.0 to 5.7 using an ‘In Place’ Upgrade

    http://mysqlserverteam.com/upgrading-directly-from-mysql-5-0-to-5-7-using-an-in-place-upgrade/

  8. [置顶] 解决Firefox/Opera 不支持 onselectstart事件

    在开发中,很多区域是不允许用户select的,在IE/Safari/Chrome中我们可以使用onselectstart事件来阻止用户选定元素内文本, 但在火狐中,这段区域还是可以选择的, 如下: & ...

  9. [Asp.net]AspNetPager分页组件

    引言 在基于Asp.net的内网系统中,分页功能是最常用的,用的最多的组件就是AspNetPager. AspNetPager 官网:http://www.webdiyer.com/aspnetpag ...

  10. mysql查询更新时的锁表机制分析(只介绍了MYISAM)

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...