码迷,mamicode.com
首页 > 编程语言 > 详细

Python 套接字socketserver网络编程

时间:2018-04-20 23:42:38      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:运行   多线程服务器   进程   127.0.0.1   多个   hand   导入   启动   一个   

为什么使用socketserver

虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的。

Python考虑得很周到,为了满足我们对多线程网络服务器的需求,提供了"socketserver"模块。socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每个客户端请求连接到服务器时,socketserver服务端都会创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

使用socketserver要点

  • 创建一个继承自"socketserver.BaseRequestHandler"的类;
  • 这个类中必须重写一个名字为"handle"的方法,不能是别的名字!
  • 将这个新建的类,连同服务器的IP和端口作为参数传递给"ThreadingTCPServer()"构造;
  • 手动启动"ThreadingTCPServer"。

栗子

服务端

import socketserver


# 必须继承socketserver.BaseRequestHandler类
class MySockServer(socketserver.BaseRequestHandler):
    def handle(self):
        # request里封装了所有请求的数据
        conn = self.request
        conn.sendall(欢迎访问socketserver服务器.encode())
        while True:
            data = conn.recv(1024).decode()
            if data == exit:
                print(断开与%s的连接! % (self.client_address,))  # 注意是元组!
                break
            elif data:
                print(来自%s客户端向你发来数据:%s % (self.client_address, data))
                conn.sendall(服务器已收到数据.encode())


if __name__ == __main__:
    # 创建一个多线程TCP服务器
    sock_server = socketserver.ThreadingTCPServer((127.0.0.1, 8888), MySockServer)
    print(启动服务器!)
    # 启动服务器,服务器将一直保持运行状态
    sock_server.serve_forever()

 

分析一下服务器端的代码,核心要点有这些:

  • 连接数据封装在"self.request"属性中!通过"self.request"对象调用"send()"和"recv()"方法。
  • "handle()"方法是整个通信的处理核心,一旦它运行结束,当前连接也就断开了(但其他的线程和客户端还正常),因此一般在此设置一个无限循环。
  • 注意"sock_server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 8888), MySockServer)"中参数传递的方法。
  • "sock_server.serve_forever()"表示该服务器在正常情况下将永远运行。

客户端

import socket

# 客户端依然使用socket模块就可以了,不需要导入socketserver模块

IP_PORT = (127.0.0.1, 8888)
sock = socket.socket()
sock.connect(IP_PORT)
sock.settimeout(0.5)
data = sock.recv(1024).decode()
print(接收返回数据:%s % data)
while True:
    inp = input(输入要发送的数据:).strip()
    if not inp:
        continue
    sock.sendall(inp.encode())

    if inp == exit:
        print(谢谢使用,再见!)
        break
    data = sock.recv(1024).decode()
    print(接收返回数据:%s % data)

sock.close()

客户端的代码很好理解,依然使用socket模块就可以了,不需要导入socketserver模块。

 

  至此。

Python 套接字socketserver网络编程

标签:运行   多线程服务器   进程   127.0.0.1   多个   hand   导入   启动   一个   

原文地址:https://www.cnblogs.com/wcwnina/p/8893693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!