编写一个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

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

对于TCPServerUDPServer来说,其在处理请求时,都是同步请求的.这意味着,只有一个请求处理完毕后,才能继续处理接下来的请求.如果请求处理需要很长时间,或者请求与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接收客户端请求后,会创建新的线程来处理请求

最新文章

  1. 复选框checkbox选中个数限制
  2. ios 把已经点击过的UILocalNotification 从系统的通知中心现实中移除
  3. .NET Expression Tree
  4. Linux用户组与用户组进阶命令
  5. 在beforeAction里redirect无效,Yii2.0.8
  6. 负载均衡之Haproxy配置详解(及httpd配置)
  7. iOS 新特性关键字
  8. 深入prototype源码之--Class
  9. RMAN数据库恢复之丢失数据文件的恢复
  10. [LeetCode234]Palindrome Linked List
  11. csv和excel的区别
  12. 2道acm简单题(2013):1.(时分秒)时间相减;2.主持人和N-1个人玩游戏,每个人说出自己认识的人数,判断其中是否有人说谎。
  13. 逆元-P3811 【模板】乘法逆元-洛谷luogu
  14. 【洛谷P4878】布局
  15. HBase笔记4(调优)
  16. 【洛谷P1230】智力大冲浪
  17. 计蒜客 无脑博士的试管们 【dfs】
  18. 译: 1. RabbitMQ Spring AMQP 之 Hello World
  19. 一道cf水题再加两道紫薯题的感悟
  20. swagger restful api form映射实体对象和body映射实体对象配置

热门文章

  1. Farseer.net轻量级ORM开源框架 V1.5版本升级消息
  2. 微信小程序中的图形验证码
  3. 迅为iTOP-4412物联网开发板入门学习高手进阶项目开发超树莓派
  4. Android(java)学习笔记188:学生信息管理系统案例(SQLite + ListView)
  5. java线程学习2
  6. python嵌套列表
  7. socket编程(Java实现)
  8. 【2018 1月集训 Day1】二分的代价
  9. 题解 P1967 货车运输
  10. Django之Ajax提交