python网络编程之TCP通信实例和socketserver框架使用例子

时间:2023-02-03 05:53:09 

1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要经过四次握手,这是由TCP的半关闭造成的,一方在完成数据发送后要发送一个FIN来终止这个方向的连接,一个TCP连接在收到一个FIN后仍能发送数据,但应用程序很少这么做,下面是TCP连接建立和拆除的过程:

python网络编程之TCP通信实例和socketserver框架使用例子python网络编程之TCP通信实例和socketserver框架使用例子

2.python可以实现TCP服务器和客户端的编程,下面是代码:

服务器端:


#!/usr/bin/env python
import socket
host="localhost"
port=10000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
while 1:
 sock,addr=s.accept()
 print "got connection form ",sock.getpeername()
 data=sock.recv(1024)
 if not data:
  break
 else:
  print data


客户端:


#!/usr/bin/env python
import socket
host="localhost"
port=10000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
s.send("hello from client")
s.close()


3.使用socketserver框架编写TCP服务器

    Socketserver模块可以简化网络服务器的编写,它包含了四种服务器类,TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用。

    使用服务器编程,需要进行一下步骤,先建立一个请求句柄类,这个类继承自BaseRequestHandler类,建立这个类后重写它的handle方法,然后实例化服务器类,把主机名,端口号和句柄类传给它,然后调用server_forever()方法来处理请求。

   使用socketserver框架的服务器:


import SocketServer
host=''
port=10000
class Handler(SocketServer.StreamRequestHandler):

 def handler(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write("connected")

server=SocketServer.TCPServer((host,port),Handler)
server.serve_forever()


上面的socketserver服务器只能处理一个请求,如果要处理多个请求,可以用forking或者threading实现,实现多进程或者多线程服务器。下面是使用forking和threading的服务器代码:

使用forking的服务器:


from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandler
class Server(ForkingMixIn,TCPServer):pass
class Handler(StreamRequestHandler):

 def handle(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write('connected')

server=Server((''.10000),Handler)
server.serve_forever()


使用多线程的服务器:


from SocketServer import TCPServer,ThreadingMixIn,StreamRequestHandler
class Server(ThreadingMixIn,TCPServer):pass

class Handler(StreamRequestHandler):
 def handle(self):
  addr=self.request.getpeername()
  print "got connection from",addr
  self.wfile.write("connected")

server=Server(('',10000),Handler)
server.serve_forever()

标签:python,TCP,网络编程,socketserver
0
投稿

猜你喜欢

  • 使用动画实现微信读书的换一批效果(两种方式)

    2023-10-23 14:30:55
  • goland把go项目打包进docker镜像的全过程记录

    2024-04-25 13:17:32
  • 使用llama Index帮你训练pdf的示例详解

    2023-07-30 23:00:33
  • 深入了解Python iter() 方法的用法

    2023-11-05 02:12:37
  • python数据分析之线性回归选择基金

    2022-03-09 08:13:59
  • python工具之清理 Markdown 中没有引用的图片

    2022-02-14 11:44:39
  • python使用ctypes库调用DLL动态链接库

    2023-12-08 14:14:05
  • DHTML实例解析:用HTC统一定制表单样式

    2007-11-04 18:48:00
  • Golang 实现Redis 协议解析器的解决方案

    2024-02-19 20:09:36
  • django自定义Field实现一个字段存储以逗号分隔的字符串

    2021-03-28 16:24:51
  • IE bug: 消失的绝对定位元素

    2009-10-26 17:59:00
  • python 判断字符串中是否含有汉字或非汉字的实例

    2022-07-01 11:25:59
  • java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input

    2010-07-16 13:23:00
  • python导包的几种方法(自定义包的生成以及导入详解)

    2021-11-19 21:33:41
  • Django与遗留的数据库整合的方法指南

    2024-01-15 02:20:32
  • flask框架jinja2模板与模板继承实例分析

    2023-08-26 22:21:34
  • Python替换NumPy数组中大于某个值的所有元素实例

    2021-11-11 07:36:20
  • 30个最常用css选择器解析

    2011-06-16 20:36:37
  • 前淘宝前端开发工程师阿当的PPT中有JS技术理念问题

    2024-05-25 15:17:53
  • JS实现普通轮播图特效

    2024-04-17 10:19:52
  • asp之家 网络编程 m.aspxhome.com