Detailed explanation of using Python Socket programming

高洛峰
Release: 2017-03-24 16:12:39
Original
1093 people have browsed it

This article mainly introduces the detailed introduction of Python Socket programming. Socket can establish connections and transmit data. It has certain reference value. Interested friends can refer to it.

When using Python for socket programming, since you need to use blocking (default) to read the data stream, you need to handle the end of the data yourself every time, which is too troublesome. And I couldn't find a good package on the Internet, so I wrote a simple package myself.

Encapsulation ideas

1. The client sends a SocketRequest object for each request, which encapsulates specific data. json is used here. For the data to be sent, an end character identifier (EOF = ‘0x00’) is automatically added.

2. When the server receives data, it generates complete data based on the end character identifier and unpacks it into a SocketRequest object.

3. The server generates a SocketResponse object based on the content of the SocketRequest. Here a SimpleRequestHandler class is used to process it. In the example, no processing is done and the object is returned as is.

4. The server sends SocketResponse to the client. The package also needs to be encapsulated, and an end character identifier (EOF = ‘0x00’) will be automatically added.

5. When the client receives data, it generates complete data based on the end character identifier, unpacks it into a SocketResponse object, and then returns it.

Packaging class

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)
Copy after login

Test

socket_server.py


##

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

ss = SocketServer(PORT)
ss.startup()
Copy after login

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
Copy after login

Run test

First, run socket_server.py

Then, run socket_client.py

The above is the detailed content of Detailed explanation of using Python Socket programming. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template