利用python的socket模块可以实现基本的网络编程,并且只限于一对一的连接。当然,也可以在其基础上实现一个网络服务器,但由于太底层这种做法不被推荐。其实如果要实现一个网络服务器很简单,调用python的内置模块socketserver就够了。

server类

  socketserver模块下面有四种套接字server类:TCPserverUDPServerUnixStreamServerUnixDatagramServer。前两种分别为使用TCP和UDP协议的server类,后两种用法和前面一样但只限于unix类系统。它们的参数都一样,如下:

TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
  • 参数server_address: IP地址和端口,为一个元组如: ("127.0.0.1", 8000)
  • 参数RequestHandlerClass: 一个自定义的handle类,主要负责实现连接到来时所要执行的操作。后面会介绍怎么自定义。
  • 参数bind_and_activate: 默认为True。如果设置为False,代表你得手动操作底层的socket,这样会更加灵活。

前面的四种类都继承自一个BaseServer类,实现了基本方法和属性:

  • fileno(): 返回一个服务器正绑定的socket文件描述符。
  • handle_requeset(): 处理一个请求。依次执行 get_request(), verify_request(), 和 process_request() 方法。用户自定义的handleclass下的handle方法抛出异常,服务器的handle_error()会被调用。
  • server_forever(poll_interval=0.5): 进入一个循环, 一直接收并处理请求直到一个显示的 shutdown() 请求到来。默认每隔0.5秒轮询(pull)一次。
  • shutdown(): 告诉server_forever()得到的循环结束循环。
  • server_address(): 返回正在监听的IP和端口,如:("127.0.0.1", 80)
  • socket: 正使用的socket对象
  • socket_type: socket类型,通常为:socket.SOCK_STREAM和socket.SOCK_DGRAM
  • timeout: 超时时间。

请求处理类

  通常需要继承BaseRequestHandler,并重写hanle()方法。当一个网络请求被创建时,一个新的实例就会被创建。

 class socketserver.BaseRequestHandler

  方法如下:

  • setup(): 在handle()被调用前被执行,一般用于一些初始化操作。默认不执行任何操作。
  • handle(): 当一个请求到来后,用户所要执行操作,这个方法应该被重写,操作self.request。
  • finish(): handle之后调用的函数,用于执行一个清理工作。

server代码如下:

 import socketserver

 class echorequestserver(socketserver.BaseRequestHandler):
def handle(self):
print('服务端启动...')
conn = self.request
print('获得连接:', self.client_address)
while True:
client_data = conn.recv(1024)
if not client_data:
print('断开连接')
break
print(client_data.decode('utf-8'))
print('开始发送...')
conn.sendall(client_data) if __name__ == '__main__':
server =socketserver.TCPServer(("127.0.0.1", 8000),echorequestserver) # 使用处理单连接的TCPServer
server.serve_forever()

客户端代码如下:

 import socket,time

 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8000)) while True:
st = input('input command: ')
if not st:break
s.send(st.encode('utf-8')) echo_back = s.recv(1024)
print(echo_back.decode('utf-8')) s.close()

  当然,以上例子是用于单线程的情况。如果想同时接收多个连接,可以换成ThreadingTCPServer,用法和上面完全一样。不过这种情况下,建议使用线程池以避免突然面临多个连接同时到来的情况。

利用python实现TCP和UDP服务器的更多相关文章

  1. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  2. 利用Python进行TCP、UDP套接字编程

    参考:http://www.cnblogs.com/whatbeg/p/5155524.html http://www.cnblogs.com/nzyjlr/p/4236287.html

  3. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

  4. python sockerserver tcp 文件下载 udp

    #tcp serverclass MyHandler(socketserver.BaseRequestHandler): def handle(self): # 通信循环 while True: tr ...

  5. python中TCP和UDP区别

    TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览 ...

  6. python网络编程socket编程(TCP、UDP客户端服务器)

    摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...

  7. 利用Python中SocketServer 实现客户端与服务器间非阻塞通信

    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...

  8. Python 绝技 —— UDP 服务器与客户端

    i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...

  9. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

随机推荐

  1. The server has either erred or is incapable of performing the requested operation. (HTTP 500)

    感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  2. 动态添加定时任务-quartz定时器

    Quartz动态添加.修改和删除定时任务 在项目中有一个需求,需要灵活配置调度任务时间,刚开始用的Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务 ...

  3. PHP中的正则表达式及模式匹配

    PHP中的正则表达式及模式匹配 PHP中对于正则处理文本提供了两种方式,一种是PCRE方式(PCRE库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当 ...

  4. linux学习笔记6--命令mv

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. mv命令用来对文件或目录重新命名,或者将文 ...

  5. C# 时间格式 yyyy/mm/dd

    今天遇到个问题在C#中将日期格式设置为yyyy/MM/dd,我是这样写的: DateTime.Now.ToString("yyyy/MM/dd"); 可是获取到的日期还是显示yyy ...

  6. TCP/IP详解读书笔记:链路层

    在TCP/IP协议族中,链路层主要有三个目的: 1)为IP模块发送和接受IP数据报: 2)为ARP模块发送ARP请求和接受ARP应答: 3)为RARP模块发送RARP请求和接受RARP应答: 以太网和 ...

  7. 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface

    网上有许多的关于 <使用code::blocks搭建objective-c的IDE开发环境>的文章. 大多是写了一个Helloworld 就结束了,今天试了试 添加了一个 @interfa ...

  8. python3颜色输出

    遇到一个项目,需求是在python3中,处理结果显示高亮加颜色,然后资料整理如下 ### 格式: \033[显示方式;前景色;背景色m 这里的格式是规定了m后面的输出字符颜色样式 说明: 前景色 背景 ...

  9. mysql 分数表实现排名

    首先初始化一张表 DROP TABLE IF EXISTS `lq_wx_sign`; CREATE TABLE `lq_wx_sign` ( `id` ) unsigned NOT NULL AUT ...

  10. EasyUI DataGrid 编辑单元格

    如下图: 现改为单击某个单元格只对此单元格进行可编辑 <TABLE>标记添加 onClickCell <table id="dg" class="eas ...