Files
http_vpn/socks5_demo_201909/Python版/client.py
T
2020-02-23 20:44:48 +08:00

62 lines
2.1 KiB
Python

import logging
import select
import socket
import struct
from socketserver import ThreadingMixIn, TCPServer, StreamRequestHandler
logging.basicConfig(level=logging.DEBUG)
# SOCKS_VERSION = 5
socks_address='127.0.0.1'
socks_port=9011
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
class SocksClient(StreamRequestHandler):
def handle(self):
logging.info('Accepting connection from %s:%s' % self.client_address)
# 建立与socks服务器的连接
try:
socks_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socks_server.connect((socks_address, socks_port))
logging.info('Connected to %s %s' % (socks_address,socks_port))
except Exception as err:
logging.error(err)
# 建立一个本机与代理服务器之间的数据交换连接
self.exchange_loop(self.connection, socks_server)
# 关闭本机数据连接(但继续监听)
self.server.close_request(self.request)
# 作为客户端,交换本机与代理服务器的数据
def exchange_loop(self, client, socks_server):
count = 0
while True:
count = count + 1
r, w, e = select.select([client, socks_server], [], [])
# 如果client监听到了来自本机的数据,读取这个数据;
# 并让socks_server发送给本机。
if client in r:
data = client.recv(4096)
print("client recv: "+count)
if socks_server.send(data) <= 0:
break
# 如果socks_server监听到了来自代理服务器的数据,读取这个数据;
# 并让client发送给本机。
if socks_server in r:
data = socks_server.recv(4096)
print("server recv: " + count)
if client.send(data) <= 0:
break
if __name__ == '__main__':
# 创建一个本机数据监听,端口号为8000
with ThreadingTCPServer(('127.0.0.1', 8000), SocksClient) as client:
client.serve_forever()