Python3(Windows) Socket编程学习(二)

客户端

学习资料:Python 网络编程 | 菜鸟教程

使用socket模块。

from socket import *
import os

ip_port=("192.168.90.87",8081) #服务端IP和端口
buffer_size = 1024 #接收消息缓冲大小

tcp_client = socket(AF_INET,SOCK_STREAM) #创建socket
tcp_client.connect(ip_port) # 建立服务端连接
while True:
    msg = input(">>>:").strip()
    if not msg:continue
    if msg =="quit":break
    #发送消息
    tcp_client.sendall(msg.encode("utf-8")) #使用encode方法转成bytes utf-8编码

    data = tcp_client.recv(buffer_size)
    print("服务器命令执行的结果是:", data.decode("utf-8")) # 将bytes转成str
tcp_client.close()

 服务器端

socket不支持多并发,使用socketserver。socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问。

  • socketserver创建

        首先创建一个请求处理类,继承BaseRequestHandlerclass类并且重写父类的handle()方法。

        其次实例化一个上面类型中的一个类(如TCPServer或UDPServer)传递服务器的地址和你上面创建的请求处理类 给这个TCPServer或rUDPServe。

        调用serve_forever()方法来处理多个请求。最后,调用server_close()关闭socket。

import socketserver
from Config import gConfig
import time

class SocketServer(socketserver.BaseRequestHandler):
    def handle(self):
        print("conn is :",self.request)
        print("addr is :",self.client_address) # addr
        while True:
            try:
                data = self.request.recv(1024)
                if not data:break

                msg = data.decode("utf-8")
                print("收到客户端的消息是",msg)
                #回消息
                curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                self.request.sendall(str(curtime+ "|OK_200").encode("utf-8"))
                
            except Exception as e:
                print(e)
                curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                self.request.sendall(str(curtime+ "|ERROR_400").encode("utf-8"))
               
                break



class SocketServerManager:
    __threadingTCPServer = None
    def start(self):
        ip_port = (gConfig.getNetIp(), gConfig.port)
    #     print(ip_port)
    #     self.ThreadingTCPServer()
        self.__threadingTCPServer = socketserver.ThreadingTCPServer(ip_port,SocketServer)
        self.__threadingTCPServer.daemon_threads = True # 设置为守护线程 后台线程。
        # self.__threadingTCPServer.handle_request() # handle_request() 只处理一个请求,处理完就退出了
        self.__threadingTCPServer.serve_forever() # 处理多个请求,永远执行 
        #print("****")

    def close(self):
        self.__threadingTCPServer.shutdown()
        self.__threadingTCPServer.server_close()

if __name__ == "__main__":
    socketManager = SocketServerManager()
    socketManager.start()

总结点

  • 时间格式化2022-00-00 00:00:00
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
  • daemon_threads 设置线程为守护线程。作用是在后台执行,并随着程序的退出而退出

  • serve_forever调用是阻塞式的。

  • __threadingTCPServer要正常关闭时,需要调用shutdown。目的是Stops the serve_forever loop。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值