Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung der Programmierung mit Python Socket

Ausführliche Erklärung der Programmierung mit Python Socket

高洛峰
高洛峰Original
2017-03-24 16:12:391077Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Einführung in die Python-Socket-Programmierung vor. Interessierte Freunde können sich darauf beziehen.

Wenn Sie Python für die Socket-Programmierung verwenden, müssen Sie das Ende der Daten jedes Mal selbst verwalten, da Sie zum Lesen des Datenstroms die Blockierungsmethode (Standard) verwenden müssen, was zu mühsam ist. Und ich konnte im Internet kein gutes Paket finden, also habe ich selbst ein einfaches Paket geschrieben.

Kapselungsidee

1. Der Client sendet für jede Anfrage ein SocketRequest-Objekt, das hier spezifische Daten kapselt. Für die zu sendenden Daten wird automatisch eine Endzeichenkennung (EOF = „0x00“) hinzugefügt.

2. Wenn der Server Daten empfängt, generiert er vollständige Daten basierend auf der Endzeichenkennung und entpackt sie in ein SocketRequest-Objekt.

3. Der Server generiert ein SocketResponse-Objekt basierend auf dem Inhalt der SocketRequest. Hier wird eine SimpleRequestHandler-Klasse für die Verarbeitung verwendet und das Objekt wird unverändert zurückgegeben .

4. Der Server sendet SocketResponse an den Client. Das Paket muss außerdem gekapselt werden und eine Endzeichenkennung (EOF = „0x00“) wird automatisch hinzugefügt.

5. Wenn der Client die Daten empfängt, werden die vollständigen Daten basierend auf der Endzeichenkennung generiert, in ein SocketResponse-Objekt entpackt und dann zurückgegeben.

Verpackungsklasse

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

Ausführen Testen Sie

Führen Sie zuerst socket_server.py aus

Dann führen Sie socket_client.py aus

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der Programmierung mit Python Socket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn