GVKun编程网logo

Python代理+线程+进程+socket(python socket代理)

12

如果您想了解Python代理+线程+进程+socket和pythonsocket代理的知识,那么本篇文章将是您的不二之选。我们将深入剖析Python代理+线程+进程+socket的各个方面,并为您解答

如果您想了解Python代理+线程+进程+socketpython socket代理的知识,那么本篇文章将是您的不二之选。我们将深入剖析Python代理+线程+进程+socket的各个方面,并为您解答python socket代理的疑在这篇文章中,我们将为您介绍Python代理+线程+进程+socket的相关知识,同时也会详细的解释python socket代理的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Python代理+线程+进程+socket(python socket代理)

Python代理+线程+进程+socket(python socket代理)


#coding=utf-8
#作者:ewang
#版本:2.7
#功能描述:编写python版本,对特定的网站,获取相关的json值
import socket  
import thread  
import urlparse  
import select
import threading
import re
import json 
import multiprocessing
BUFLEN=8192
class Proxy(object):  
    def __init__(self,conn,addr):  
		self.source=conn  
		self.request=""
		self.Json=""
		self.Jrespone=""
		self.destnation=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
		self.run()  
  
    def get_headers(self):  
		header=''''  
		while True:  
			header+=self.source.recv(BUFLEN)  
			index=header.find(''\n'')  
			if index >0:  
				break    
		self.request=header[index+1:]
		
				 
    def conn_destnation(self):   
		ip=socket.gethostbyname("要获取数据的页面")   
		self.destnation.connect_ex((ip,80))  
		data="%s %s %s\r\n" %("POST","URL","HTTP/1.1")  
		self.destnation.send(data+self.request)
		item=re.findall(''\"props\"\s*:(.+})\,'',self.request,re.S)
		item=item[0].replace("     ","")
		#对json文件编码
		Jdumps=json.dumps(item,sort_keys=True)
		#对json文件解码
		Jrespone=json.loads(Jdumps)	
		json_respone=json.loads(item)
		self.Json=json_respone
		self.Jrespone=Jrespone
		if self.Json["appName"]=="event":
			print self.Jrespone
			
    def run(self):
		self.get_headers()
		self.conn_destnation()
		  
		
  
  
class Server(object):  
  
    def __init__(self,host,port):   
		self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
		self.server.bind((host,port))  
		self.server.listen(5)
		self.start() 
  
    def start(self):
		while True:  
			try: 
				conn,addr=self.server.accept()
				thread.start_new_thread(Proxy(conn,addr),())				
			except:  
				pass 

if __name__==''__main__'':
	print u"服务器IP:",
	serverIp=str(raw_input())
	print u"服务器端口号:",
	serverPort=int(raw_input())
	print u"开始获取数据........"
	p = multiprocessing.Process(target = Server, args = (serverIp,serverPort))
	p.start()



该脚本是为了针对数据测试中,提高工作效率,针对特定于网页来进行json数据的获取,通过json数据与预期的json数据进行比对。
代码中的“URL”是特定网站的URL,可以根据需求进行改动,可以把之前的代码与此相结合,来达到自己的需求。为使代码运行快,采用线程和进程来提高运行速度


python 3.x 学习笔记14 (socket_ssh and socket_文件传输)

python 3.x 学习笔记14 (socket_ssh and socket_文件传输)

ssh服务端

import socket,os

server = socket.socket()
server.bind((''localhost'',6666))

server.listen()
conn, addr = server.accept()
while True:
    print(''等待新数据!'')
    cmd = conn.recv(1024)
    
    if len(cmd) == 0:
        break
        
    data = os.popen(cmd.decode()).read()
    cmd_size = len(data.encode(''utf-8''))
    print(''检测到数据大小'',cmd_size)
    
    if len(data) == 0:
        data = ''没有此命令!!''
        
    conn.send(str(len(data.encode(''utf-8''))).encode())
    order = conn.recv(1024)

    conn.send(data.encode(''utf-8''))
    print(''传送完成!'')

server.close()

ssh客户端

import socket

client = socket.socket()
client.connect((''localhost'',6666))
while True:
    cmd = input(''>>>:'')
    
    if cmd == 0:
        continue
        
    client.send(cmd.encode(''utf-8''))
    cmd_size = client.recv(1024)
    print(''服务端检测到数据大小:'', cmd_size)
    
    if len(cmd_size) !=0:
        client.send(''可以发送数据了''.encode(encoding=''utf-8''))
        
    receive_size = 0
    receive_cmd = b''''
    
    while receive_size < int(cmd_size.decode()):
        data = client.recv(1024)
        receive_size += len(data)
        receive_cmd += data
    else:
        print(''接收到数据大小:'',receive_size)
        print(''数据接收完成!'')
        print(receive_cmd.decode())

 

socket文件传输并校验

服务端

import socket,os,hashlib

server = socket.socket()
server.bind((''localhost'',6666))
server.listen()
conn, addr = server.accept()
while True:
    print(''等待新数据!'')
    cmd = conn.recv(1024)
    if len(cmd) == 0:
        break
    filename = cmd.decode().split()[1]
    print(filename)
    if os.path.isfile(filename):          #判断文件是否存在
        f = open(filename,''rb'')           #打开文件
        m = hashlib.md5()
        file_size = os.stat(filename).st_size   #查询文件大小
        print(file_size)
        conn.send(str(file_size).encode())         #给客户端发送文件大小
        conn.recv(1024)                              #等待并接受客户端的确认,这一步可以解决粘包问题
        for line in f:                              #边读边循环发送文件
            m.update(line)                           #得出每一句的md5值
            conn.send(line)                           #发送给客户端
        print(''file md5:'',m.hexdigest())
        f.close()
        conn.recv(1024)
        conn.send(m.hexdigest().encode())

    print(''传送完成!'')

server.close()

socket文件传输并校验

客户端

import socket,hashlib

client = socket.socket()
client.connect((''localhost'',6666))
while True:
    cmd = input(''>>>:'').strip()
    if len(cmd) == 0:
        continue
    if cmd.startswith(''get''):          #传输文件名要以get开头如:get var
        client.send(cmd.encode(''utf-8''))
        file_size = client.recv(1024)
        print(''服务端检测到文件大小:'', int(file_size))
        client.send(''可以发送数据了''.encode(encoding=''utf-8''))
        file_total_size = int(file_size)
        receive_size = 0
        filename = cmd.split()[1]         #以空格分割然后取出文件名
        f = open(''new_''+filename ,''wb'')
        m = hashlib.md5()
        while receive_size < file_total_size:
            data = client.recv(1024)
            m.update(data)
            receive_size += len(data)
            f.write(data)
            print(file_total_size, receive_size)
        else:
            new_file_md5 = m.hexdigest()
            print(''数据接收完成!'')
            f.close()
            client.send(''可以发送md5值了''.encode())
        serve_md5 = client.recv(1024)
        print(''新文件md5:'',new_file_md5)
        print(''原文件md5:'',serve_md5)

client.close()

 

python Socket socketserver

python Socket socketserver

Socket

套接字

socket的 类型 实现socket对象时传入 到socket 类中

socket.AF_INET    服务器间的通讯  IPv4
socket.AF_INET6		IPv6
socket.SOCK_STREAM   流试  tcp 传输方式  默认类型
socket.SOCK_DGRAM 	 包式	 udp 传输方式

返回前端数据 需要先发送报头

b''HTTP/1/1 200 OK \r\n\r\n''

基于 Tcp 传输方式

服务端 server

import socket

server = socket.socket()
# 允许地址重用
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 绑定 ip 及 端口
server.bind(("192.168.15.100", 8001))
监听  tcp 传入链接  可设置链接个数   listen(4)
server.listen()
# 等待建立链接   conn  管道  addr 客户端的地址
conn, addr = server.accept()
#接收数据
content = conn.recv(1024).decode("utf-8")
print(content)
# 发送数据
conn.send("再见".encode("utf-8"))

# 循环发送数据  直到数据发送完毕
conn.sendall("再见..........".encode("utf-8"))
# 关闭
conn.close()
server.close()

客户端 client

import socket

clinet = socket.socket()
clinet.connect(("192.168.15.100", 8001))
clinet.send(st.encode("utf-8"))

clinet.recv(1024).decode("utf-8")

clinet.close()

基于 Udp 传输方式

服务端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(("127.0.0.1", 8001))
# 等待接收数据
conn, addr = server.recvfrom(1024)
st = conn.decode("utf-8")
# 向某个地址 返回数据
server.sendto(st.encode("utf-8"), addr)

客户端

import socket
clinet = socket.socket(type=socket.SOCK_DGRAM)

clinet.sendto(''你好啊!'', ("127.0.0.1", 8001))
conn, addr = clinet.recvfrom(1024)
print(conn.decode("utf-8"))

server.sendto(st.encode("utf-8"), addr)

缓冲区

作用:

​ 防止数据丢失

输入缓冲区 #recv 输出缓冲区 #send

粘包

粘包(tcp的两种粘包现象)

  1. 连续发送小的数据,并且每次发送之间的时间间隔很短(输出缓冲区:两个消息在缓冲区黏在一起了)

    原因是TCP为了传输效率,做了一个优化算法(Nagle),减少连续的小包发送(因为每个消息被包裹以后,都会有两个过程:1 组包 2拆包)

  2. 第一次服务端发送的数据比我客户端设置的一次接收消息的大小要大,那么接收不完,第二次再接收的时候,就会将第一次剩余的消息接收到

粘包的根本原因是因为:双方不知道对方发送消息的大小

  • 解决方案一:

    发送消息之前,先计算要发送消息的长度,然后先将消息长度发送过去,对方给你回一个确认收到长度的信息,然后根据接收到的消息长度来修改自己一次接收消息的大小 这个过程多了一次交互

  • 粘包解决方案二

    使用 **struct ** 模块打包

tcp和udp的区别

​ tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是面向流的,无消息保护边界0 ​ udp协议:面向无连接,消息不可靠,传输速度快,消息是面向包的,有消息保护边界.

socketserver

  • 简化网络服务端的编写

服务端 SocketServer模块与简单并发服务器

import socketserver
import struct 

class Myserver(socketserver.BaseRequestHandler):
    # 定义一个方法  handle 方法名字不可以变
    def handle(self):
        try:
            while 1:  # 循环接受 回复 数据
                # self.request 就是 conn 链接通道

                client_data = self.request.recv(1024).decode("utf-8")
                print(client_data)
                # 返回信息
                self.request.send("输入>>>".encode("utf-8"))
        except ConnectionResetError as c:
            print(c)

if __name__ == "__main__":

    server_ip = (''127.0.0.1'',8001)
    # 地址重用
    # socketserver.TCPServer.allow_reuse_address = True
    # 绑定ip 端口  启动 Myserver 类   ThreadingTCPServer>>>多线程的TCP服务端
    server = socketserver.ThreadingTCPServer(server_ip, Myserver)
    # 永久执行下去
    server.serve_forever()

FTP

#进度条打印,print版
import time
for i in range(20):
    #\r 回到行首打印内容,如果同一行有内容,那么就被抹掉了
    n = ''>'' * i
    print(''\r%s'' %n,end='''')
    time.sleep(0.5)

#进度条打印,sys版
import sys
import time
for i in range(10):
    sys.stdout.write(''>'')
    sys.stdout.flush()
    time.sleep(0.5)


#搞百分比的样子
#0.42857142857142855 改成两位数,不进行四舍五入
print(3/7) #0.42857142857142855
print(round(3/7,2)) #0.43  43%
print(int(3/7*100))

python socket 套接字编程 单进程服务器 实现多客户端访问

python socket 套接字编程 单进程服务器 实现多客户端访问

服务器:

 1 import socket
 2 #单进程服务器 实现多客户端访问 IO复用
 3 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤
 4 #这就是apache: select模型 6 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 7 server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置端口复用
 8 #AF_INET: IPV4
 9 #AF_INET6: IPV6
10 #SOCK_STREAM: TCP
11 #SOCK_DGRAM: UDP
12 Host = ''''
13 port = 23333
14 server.bind((Host,port))
15 #服务器绑定端口 8080
16 server.listen(5)
17 #服务器同时监听5个 最大链接数 5
18 
19 print(''[+]  server open'')
20 
21 c_server = {}
22 #定义一个全局字典
23 server.setblocking(0)
24 #设置服务器recv接受信息和send发送信息为非阻塞状态(默认为阻塞状态)
25 #是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
26 while True:
27     try:
28         try:
29 
30             client,c_addr = server.accept()
31 
32         except BlockingIOError:
33             #无法立即完成一个非阻止性套接字操作。
34             if not c_server:
35                 #如果字典为空
36                 continue
37                 #重新接收套接字
38             pass
39         else:
40             client.setblocking(0)#设置套接字属性为非阻塞
41             #是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
42             #[WinError 10035] 无法立即完成一个非阻止性套接字操作。
43             c_server[client] = c_addr#以字典形式存储新链接的套接字
44             print(''[+] from'',c_addr)
45         for a in list(c_server.keys()):
46             #这里将字典的keys取出来 在列表化,在没有信息的时候删除套接字了
47             try:
48                 msg = a.recv(1024).decode(''utf-8'')
49                 #非阻塞接受消息,但是如果客户端不马上发送,就会报错,所以设置一个延迟接收
50             except BlockingIOError as e:
51                 continue
52 
53             if not msg:
54                 print(''[%s] closed''%(c_server[a][0]))
55                 a.close()
56                 del c_server[a]
57                 continue
58             print("来自%s的消息: %s"%(c_server[a][0],msg))
59             a.send(msg.encode(''utf-8''))
60             #发送重复的消息
61     except KeyboardInterrupt:
62         break
63 
64 
65 server.close()

 

 

客户端:

 

 

 1 #coding:utf-8
 2 
 3 import socket
 4 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 5 #创建一个客户端链接,socket.AF_INET代表ipv4,socket.SOCK_STREAM代表tcp套接字
 6 client.connect((''127.0.0.1'',23333))
 7 #客户端链接
 8 print(''[+]  链接成功'')
 9 #链接成功显示
10 while True:
11     msg = input(''>>>'')
12     if msg == ''quit'':
13         #如果输入的信息是quit  就退出链接
14         break
15     if len(msg) == 0:#如果直接输入的一个回车的话
16     #就重新输入,因为不能发送空 ,发送空的花  客户端会卡住
17         continue
18     client.send(msg.encode(''utf-8''))
19     #客户端发送信息msg  以utf8格式发送数据
20     data = client.recv(1024).decode(''utf-8'')
21     if not data:
22         #如果数据为空/0  
23         #服务器主动断开s
24         break
25         print(''[+]  服务器主动断开了链接......'')
26 
27     print(''服务器发来:'',data)
28 
29 
30 print(''[+]  链接关闭...'')
31 
32 client.close()

 

服务器就是apache: select模型

 

Python socket.accept 在代理上不起作用

Python socket.accept 在代理上不起作用

如何解决Python socket.accept 在代理上不起作用?

所以,这是我的代码(别管我的调试文本;)) 我被困在“5”,我已经在服务器和代理之间建立了连接,但没有在代理和客户端之间建立连接 我也把 0.0.0.0 作为主机

class Game2Proxy(Thread):

    def __init__(self,port,host):
        super(Game2Proxy,self).__init__()
        print("1")
        self.server = None
        self.port = port
        self.host = host
        sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
        print("2")
        sock.setsockopt(socket.soL_SOCKET,socket.so_REUSEADDR,1)
        print("3")
        sock.bind((host,port))
        print("4")
        sock.listen(10)
        print("5")
        self.game,addr = sock.accept()
        print("Game2Proxy connection established")

    def run(self):

        while True:
            data = self.game.recv(4096)
            if data:
                print(''Data send to server : '',end="")
                print(data)
                self.server.sendall(data)```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

关于Python代理+线程+进程+socketpython socket代理的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于python 3.x 学习笔记14 (socket_ssh and socket_文件传输)、python Socket socketserver、python socket 套接字编程 单进程服务器 实现多客户端访问、Python socket.accept 在代理上不起作用等相关内容,可以在本站寻找。

本文标签: