이 기사에서는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!