编写一个SocketServer需要实现以下步骤

  1. 编写一个handler类,继承BaseRequestHandler,重写handle()方法
  2. 针对是TCP还是UDP,生成一个server对象
  3. 调用server对象的handle_request或者serve_forever方法

服务器端:

#coding:utf-8

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
#client_address为元组,(client_addr,client_port)
print self.client_address
print "{} wrote:".format(self.client_address[0])
print self.data
self.request.sendall(self.data.upper()) if __name__ == "__main__":
HOST,PORT = "localhost",9999
server = SocketServer.TCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()

客户端:

#coding:utf-8

import socket
import sys HOST,PORT = "localhost",9999
data = raw_input("please input your info:")
print "data:",data
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) try:
sock.connect((HOST,PORT))
sock.sendall(data + '\n')
received = sock.recv(1024)
print "received:",received
finally:
sock.close()
#format函数可以接受不限个参数,位置可以不按顺序,可以不用或者使用多次
print '{0},{1}'.format('ljy',24)
print '{1},{0},{1}'.format('zju',120)
#通过关键字参数
print '{name},{age}'.format(age = 18,name = "gebilaowang")

SocketServer是python提供的实现socket server的模块.利用其提供的api,可以很方便快速的开发一个socket服务器.整体上来说,模块提供了四个使用的类:

  • TCPServer
  • UDPServer
  • UnixStreamServer
  • UnixDatagramServer

上述的四个类都是同步的,即意味着当有请求过来后,其将同步处理数据,处理完之后才能处理下一个请求.

对于TCPServer和UDPServer来说,其在处理请求时,都是同步请求的.这意味着,只有一个请求处理完毕后,才能继续处理接下来的请求.如果请求处理需要很长时间,或者请求与Server之间有较多的交互,那同步处理就不大合适了.

在SocketServer模块中,提供了两种服务模型.

  • ThreadingMixIn
  • ForkingMixIn

顾名思义,ThreadingMixIn代表其在有新的请求时,创建一个新的线程,在该线程中处理请求.相对应的,ForkingMixIn表示在有新的请求时,创建一个新的进程,在该进程中处理请求.

对于该选择何种模型,可以考虑是否需要请求间数据共享.

#coding:utf-8

import socket
import SocketServer
import threading class ThreadTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
cur_thread = threading.current_thread()
response = "{}:{}".format(cur_thread.name,data)
self.request.sendall(response) class ThreadTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer):
pass def client(ip,port,message):
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((ip,port)) try:
sock.sendall(message)
response = sock.recv(1024)
print"received : {}".format(response)
finally:
sock.close() if __name__ == "__main__":
HOST,PORT = "localhost",8888
server = ThreadTCPServer((HOST,PORT),ThreadTCPRequestHandler)
ip,port = server.server_address
#server_thread接收client请求
server_thread = threading.Thread(target = server.serve_forever)
server_thread.daemon = True
server_thread.start()
print 'server loop running in thread:',server_thread.name for i in range(3):
thread = threading.Thread(target = client,args = (ip,port,'hello world from{}'.format(i)))
thread.start()
print 'thread {} start'.format(i)

上述代码中,一个线程运行server,有多个客户端线程0,1,2,server接收客户端请求后,会创建新的线程来处理请求

python之SocketServer编程的更多相关文章

  1. Python学习---socketServer编程

    学会去看源码 服务器端: import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): ...

  2. Python学习---网络编程 1217【all】

    OSI七层模型: 物理层, 数据链路层, 网络层,传输层,会话层,表达层,应用层 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:I ...

  3. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  4. python之网络编程

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...

  5. python基础网络编程--转

    python之网络编程 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的 ...

  6. Python基础-socket编程

    一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...

  7. python 基础网络编程2

    python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...

  8. python 基础网络编程1

    python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...

  9. python之socket编程(一)

    socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...

随机推荐

  1. Matlab中size、numel、length、fix函数的使用

    size():获取矩阵的行数和列数  (1)s=size(A),      当只有一个输出参数时,返回一个行向量,该行向量的第一个元素时矩阵的行数,第二个元素是矩阵的列数. (2)[r,c]=size ...

  2. webgl推荐书籍

    网址:https://www.douban.com/doulist/45940373/ webgl 来自: Pasu2017-04-17创建   2017-07-25更新   推荐 关注 2 人关注 ...

  3. winpcap编程设置过滤器之指定获取某个网站的数据

    下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址.  42.62.0.14 我玩的游戏服是84区.网 ...

  4. 获取minist数据并转换成lmdb

    caffe本身是没有数据集的,但在data目录下有获取数据的一些脚本.MNIST,一个经典的手写数字库,包含60000个训练样本和10000个测试样本,每个样本为28*28大小的黑白图片,手写数字为0 ...

  5. 【BIEE】新建用户,并且赋予组BIconsumer,访问BIpublisher报表报错:检索数据xml时出错

    问题描述 今天新建一个用户用户查看报表,并且赋予该用户属于BIConsumer组,但是在访问报表的时候出现以下两个错: 1.xdo格式类的报表 2.RTF模板制作的报表 解决方案: 出现这个问题的原因 ...

  6. 第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)

    ReduceTask的运行的整个过程 背下来1.启动线程到mapTask那里去拷贝数据,拉取属于每一个reducetask自己内部的数据2.数据的合并,拉取过来的数据进行合并,合并的过程,有可能在内存 ...

  7. 制作framework&静态库

    http://blog.csdn.net/justinjing0612/article/details/7880712     (制作framework) http://blog.sina.com.c ...

  8. 时间戳显示为多少分钟前,多少天前的JS处理

    /* ** 时间戳显示为多少分钟前,多少天前的处理 ** eg. ** console.log(dateDiff(1411111111111)); // 2014年09月19日 ** console. ...

  9. gulp(1) 的使用

    1.安装node.js 2.全局安装gulp.js npm install gulp -g 3.在项目本地根目录再安装(通过黑窗口安装)npm install --save-dev gulp/ 或者 ...

  10. [Python3网络爬虫开发实战] 5.2-关系型数据库存储

    关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之 ...