>  기사  >  백엔드 개발  >  Python Socket을 이용한 프로그래밍에 대한 자세한 설명

Python Socket을 이용한 프로그래밍에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-24 16:12:391035검색

이 기사에서는 주로 Python 소켓 프로그래밍에 대한 자세한 소개를 소개합니다. 소켓은 연결을 설정하고 데이터를 전송할 수 있으므로 관심 있는 친구들이 참고할 수 있습니다.

소켓 프로그래밍을 위해 Python을 사용할 때 데이터 스트림을 읽으려면 차단(기본) 방법을 사용해야 하기 때문에 매번 데이터의 끝을 직접 처리해야 하는데 이는 너무 번거롭습니다. 그리고 인터넷에서 좋은 패키지를 찾을 수 없어서 간단한 패키지를 직접 작성했습니다.

캡슐화 아이디어

1. 클라이언트는 각 요청에 대해 특정 데이터를 캡슐화하는 SocketRequest 개체를 보냅니다. 전송할 데이터에는 끝 문자 식별자(EOF = '0x00')가 자동으로 추가됩니다.

2. 서버는 데이터를 수신하면 끝 문자 식별자를 기반으로 완전한 데이터를 생성하고 이를 SocketRequest 객체로 압축 해제합니다.

3. 서버는 SocketRequest의 내용을 기반으로 SocketResponse 객체를 생성합니다. 여기서 SimpleRequestHandler 클래스는 처리를 위해 사용되지 않으며 객체는 그대로 반환됩니다.

4. 서버가 클라이언트에 SocketResponse를 보냅니다. 패키지도 캡슐화해야 하며 끝 문자 식별자(EOF = '0x00')가 자동으로 추가됩니다.

5. 클라이언트가 데이터를 수신하면 끝 문자 식별자를 기반으로 완전한 데이터가 생성되고 SocketResponse 개체에 압축이 풀린 다음 반환됩니다.

패키징 클래스

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)

테스트

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

테스트 실행

먼저 소켓_server.py를 실행하세요

그런 다음, 소켓_client.py를 실행하세요

위 내용은 Python Socket을 이용한 프로그래밍에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.