问题

你想实现一个服务器,通过TCP协议和客户端通信。

解决方案

创建一个TCP服务器的一个简单方法是使用 socketserver 库。例如,下面是一个简单的应答服务器:

from socketserver import BaseRequestHandler, TCPServer

class EchoHandler(BaseRequestHandler):

def handle(self):

print('Got connection from', self.client_address)

while True:

msg = self.request.recv(8192)

if not msg:

break

self.request.send(msg)

if __name__ == '__main__':

serv = TCPServer(('', 20000), EchoHandler)

serv.serve_forever()

在这段代码中,你定义了一个特殊的处理类,实现了一个 handle() 方法,用来为客户端连接服务。 request 属性是客户端socket,client_address 有客户端地址。 为了测试这个服务器,运行它并打开另外一个Python进程连接这个服务器:

>>> from socket import socket, AF_INET, SOCK_STREAM

>>> s = socket(AF_INET, SOCK_STREAM)

>>> s.connect(('localhost', 20000))

>>> s.send(b'Hello')

5

>>> s.recv(8192)

b'Hello'

>>>

很多时候,可以很容易的定义一个不同的处理器。下面是一个使用 StreamRequestHandler 基类将一个类文件接口放置在底层socket上的例子:

from socketserver import StreamRequestHandler, TCPServer

class EchoHandler(StreamRequestHandler):

def handle(self):

print('Got connection from', self.client_address)

# self.rfile is a file-like object for reading

for line in self.rfile:

# self.wfile is a file-like object for writing

self.wfile.write(line)

if __name__ == '__main__':

serv = TCPServer(('', 20000), EchoHandler)

serv.serve_forever()

讨论

socketserver 可以让我们很容易的创建简单的TCP服务器。 但是,你需要注意的是,默认情况下这种服务器是单线程的,一次只能为一个客户端连接服务。 如果你想处理多个客户端,可以初始化一个 ForkingTCPServer 或者是 ThreadingTCPServer 对象。例如:

from socketserver import ThreadingTCPServer

if __name__ == '__main__':

serv = ThreadingTCPServer(('', 20000), EchoHandler)

serv.serve_forever()

使用fork或线程服务器有个潜在问题就是它们会为每个客户端连接创建一个新的进程或线程。 由于客户端连接数是没有限制的,因此一个恶意的黑客可以同时发送大量的连接让你的服务器奔溃。

如果你担心这个问题,你可以创建一个预先分配大小的工作线程池或进程池。 你先创建一个普通的非线程服务器,然后在一个线程池中使用 serve_forever() 方法来启动它们。

if __name__ == '__main__':

from threading import Thread

NWORKERS = 16

serv = TCPServer(('', 20000), EchoHandler)

for n in range(NWORKERS):

t = Thread(target=serv.serve_forever)

t.daemon = True

t.start()

serv.serve_forever()

一般来讲,一个 TCPServer 在实例化的时候会绑定并激活相应的 socket 。 不过,有时候你想通过设置某些选项去调整底下的 socket` ,可以设置参数 bind_and_activate=False 。如下:

if __name__ == '__main__':

serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False)

# Set up various socket options

serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# Bind and activate

serv.server_bind()

serv.server_activate()

serv.serve_forever()

上面的 socket 选项是一个非常普遍的配置项,它允许服务器重新绑定一个之前使用过的端口号。 由于要被经常使用到,它被放置到类变量中,可以直接在 TCPServer 上面设置。 在实例化服务器的时候去设置它的值,如下所示:

if __name__ == '__main__':

TCPServer.allow_reuse_address = True

serv = TCPServer(('', 20000), EchoHandler)

serv.serve_forever()

在上面示例中,我们演示了两种不同的处理器基类( BaseRequestHandler 和 StreamRequestHandler )。 StreamRequestHandler 更加灵活点,能通过设置其他的类变量来支持一些新的特性。比如:

import socket

class EchoHandler(StreamRequestHandler):

# Optional settings (defaults shown)

timeout = 5 # Timeout on all socket operations

rbufsize = -1 # Read buffer size

wbufsize = 0 # Write buffer size

disable_nagle_algorithm = False # Sets TCP_NODELAY socket option

def handle(self):

print('Got connection from', self.client_address)

try:

for line in self.rfile:

# self.wfile is a file-like object for writing

self.wfile.write(line)

except socket.timeout:

print('Timed out!')

最后,还需要注意的是绝大部分Python的高层网络模块(比如HTTP、XML-RPC等)都是建立在 socketserver 功能之上。 也就是说,直接使用 socket 库来实现服务器也并不是很难。 下面是一个使用 socket 直接编程实现的一个服务器简单例子:

from socket import socket, AF_INET, SOCK_STREAM

def echo_handler(address, client_sock):

print('Got connection from {}'.format(address))

while True:

msg = client_sock.recv(8192)

if not msg:

break

client_sock.sendall(msg)

client_sock.close()

def echo_server(address, backlog=5):

sock = socket(AF_INET, SOCK_STREAM)

sock.bind(address)

sock.listen(backlog)

while True:

client_sock, client_addr = sock.accept()

echo_handler(client_addr, client_sock)

if __name__ == '__main__':

echo_server(('', 20000))

以上就是Python 创建TCP服务器的方法的详细内容,更多关于Python 创建TCP服务器的资料请关注python博客其它相关文章!

python tcp服务器_Python 创建TCP服务器的方法相关推荐

  1. python 搭建的http 动态服务器_Python 创建HTTP服务器的简单示例

    这篇文章主要为大家详细介绍了Python 创建HTTP服务器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  2. Python使用Flask模块创建本地服务器

    Flask是一个使用 Python 编写的轻量级 Web 应用框架.Flask和Django是Python中最流行的web开发框架,与Django不同的是,Flask适合开发小型项目,通过服务器提供服 ...

  3. 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信

    客户端/服务器网络编程介绍 套接字:通信端点 实例:客户端发送数据,接收服务器返回的时间戳 用Python 编写FTP 客户端程序 客户端/服务器网络编程介绍 软件服务器也运行在一块硬件之上,但是没有 ...

  4. python 监听tcp端口_创建TCP监听_创建TCP监听_功能示例_Python SDK示例_SDK 参考_开发指南_负载均衡 - 阿里云...

    # encoding=utf-8 import json import sys # 调用AcsClient参数进行身份验证 from aliyunsdkcore.client import AcsCl ...

  5. sql新建oracle链接服务器,oracle 创建链接服务器

    SqlServer下数据库链接的使用方法 有时候我们希望在一个sqlserver下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成这些操作,我们首要的是创建 ...

  6. python color属性_Python中类的属性、方法及内置方法

    1.类的属性成员变量 对象的创建创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性对象聚丙属性和方法, 句柄用于区分不同的对象, 对象的属性和方法,与类中的成员变量和成员函数对应, o ...

  7. python 连通区域_python skimage 连通性区域检测方法

    python skimage 连通性区域检测方法 涉及到的函数为 import matplotlib.pyplot as plt from skimage import measure, color ...

  8. python探测端口_python检测远程服务器tcp端口的方法

    本文实例讲述了python检测远程服务器tcp端口的方法.分享给大家供大家参考.具体如下: python检测远程服务器tcp端口的代码,这段代码可以用来做服务器监控实用 #!/usr/bin/env ...

  9. python tcp服务器_python实现TCP服务器端与客户端的方法详解

    本文实例讲述了python实现TCP服务器端与客户端的方法.分享给大家供大家参考.具体如下: TCP服务器程序(tsTserv.py): from socket import * from time ...

最新文章

  1. 源码安装nginx开启SSL功能
  2. java采集温湿度水浸_配电室水浸及温湿度监测系统可加强环境保障
  3. 《部署IPv6网络(修订版)》一2.4 邻居发现协议
  4. mysql 编码和汉字存储占用字节问题的探索
  5. Go worker并发模式
  6. 计算机自然语言的中国科学家,中科院教授王斌加入小米 任自然语言处理首席科学家...
  7. 删除域中不再存在的主机
  8. mysql alter event_MYSQL ALTER EVENT介绍
  9. 解题报告:poj2689 Prime Distance
  10. Linux 目录简要结构认识
  11. SharpPcap学习笔记
  12. magento yandex插件 moneta插件 qiwi插件 俄罗斯银行
  13. 「PNG搜索网」 PNG素材哪里找,吐血干货!
  14. oracle餐馆系统分析,现代饭店管理-试卷A
  15. 国内电影下载网站收集
  16. qchart 怎么点击一下 出一条线_陈奕迅唱歌技巧,学好这几点,你也能唱出更具有穿透力和磁性的声音...
  17. 微信小程序的购物车功能
  18. MTK交换机PHY 方案Airoha达发(econet)概要
  19. 【附源码】计算机毕业设计SSM校园流浪猫关爱系统
  20. 文件系统层次结构标准和Linux上下载源代码配置编译安装

热门文章

  1. 过度封装的ZeroMQ
  2. 谷歌是 CNCF 开源项目最大贡献者,红帽次之
  3. linux查看内存、CPU占用资源最多的进程
  4. 导出Excle java
  5. Activity生命周期的补充
  6. XCode6 生成prefix.pch文件
  7. [Asp.net]站点地图SiteMap
  8. 3.1 Adapter(适配器)
  9. java的注释规范_Java 注释规范
  10. 【温故知新】CSS学习笔记(背景)