Maison >développement back-end >Tutoriel Python >Explication détaillée de l'utilisation de la programmation Python Socket

Explication détaillée de l'utilisation de la programmation Python Socket

高洛峰
高洛峰original
2017-03-24 16:12:391116parcourir

Cet article présente principalement l'introduction détaillée de la programmation Python Socket. Socket peut établir des connexions et transmettre des données. Il a une certaine valeur de référence.

Lorsque vous utilisez Python pour la programmation socket, puisque vous devez utiliser la méthode de blocage (par défaut) pour lire le flux de données, vous devez gérer vous-même la fin des données à chaque fois, ce qui est trop gênant. Et je n'ai pas trouvé de bon package sur Internet, alors j'ai écrit moi-même un package simple.

Idée d'encapsulation

1 Le client envoie un objet SocketRequest pour chaque requête, qui encapsule des données spécifiques ici. Pour les données à envoyer, un identifiant de caractère de fin (EOF = ‘0x00’) est automatiquement ajouté.

2. Lorsque le serveur reçoit des données, il génère des données complètes basées sur l'identifiant du caractère de fin et les décompresse dans un objet SocketRequest.

3. Le serveur génère un objet SocketResponse basé sur le contenu de SocketRequest. Ici, une classe SimpleRequestHandler est utilisée pour le traitement. Dans l'exemple, aucun traitement n'est effectué et l'objet est renvoyé tel quel. .

4. Le serveur envoie SocketResponse au client. Le package doit également être encapsulé et un identifiant de caractère de fin (EOF = '0x00') sera automatiquement ajouté.

5. Lorsque le client reçoit les données, les données complètes sont générées en fonction de l'identifiant du caractère de fin, décompressées dans un objet SocketResponse, puis renvoyées.

Classe d'emballage

sockets.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import pickle
import thread


PORT = 12345
EOF = '0x00'


class SocketServer(object):

  def __init__(self, port=None):
    self.port = port

  def startup(self):
    sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock_server.bind(('0.0.0.0', self.port))
    sock_server.listen(0)

    while True:
      sock, address = sock_server.accept()
      thread.start_new_thread(self.__invoke, (sock, address))

  def shutdown(self):
    pass

  def __invoke(self, sock, address):
    try:
      full_data = ''
      while True:
        data = sock.recv(1024)
        if data is None:
          return

        full_data += data
        if full_data.endswith(EOF):
          full_data = full_data[0:len(full_data) - len(EOF)]
          request = pickle.loads(full_data)
          response = SimpleRequestHandler().handle(request)
          sock.sendall(pickle.dumps(response) + EOF)
          return
    except Exception as e:
      print e
    finally:
      sock.close()


class SocketClient(object):

  def __init__(self, host, port):
    self.host = host
    self.port = port

  def execute(self, request):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((self.host, self.port))

    try:
      sock.sendall(pickle.dumps(request) + EOF)
      full_data = ''
      while True:
        data = sock.recv(1024)
        if data:
          full_data += data
          if full_data.endswith(EOF):
            full_data = full_data[0:len(full_data) - len(EOF)]
            response = pickle.loads(full_data)
            return response
        else:
          return None
    except Exception as e:
      print e
      return None
    finally:
      sock.close()


class SocketRequest(object):
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.__dict__)


class SocketResponse(object):
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.__dict__)


class SimpleRequestHandler(object):
  def __init__(self):
    pass

  def __repr__(self):
    return repr(self.__dict__)

  def handle(self, request):
    return SocketResponse(request.data)

Test

socket_server.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from agent.sockets import *

ss = SocketServer(PORT)
ss.startup()

socket_client.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pickle
from agent.sockets import *


sc = SocketClient('localhost', PORT)
request = SocketRequest('abc')
response = sc.execute(request)
print request
print response

Exécuter Test

Tout d'abord, exécutez socket_server.py

Ensuite, exécutez socket_client.py

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn