Python实现端口复用实例代码
作者:shichen2014 发布时间:2023-12-16 19:58:32
标签:Python
本文介绍Python实现端口复用实例如下所示:
#coding=utf-8
import socket
import sys
import select
import threading
host='192.168.99.100'
port=80
class Thread(threading.Thread):
def __init__(self,buf,sockfd):
threading.Thread.__init__(self)
self.buf=buf
self.sockfd=sockfd
def run(self):
if len(self.buf)!=0:
if 'GET' in self.buf : #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',80))
s2.send(self.buf)
bufer=''
while 1:
recv_data=s2.recv(1024)
bufer+=recv_data
if len(recv_data)==0:
break
print bufer,len(bufer)
if len(bufer)==0:
pass
self.sockfd.send(bufer) #将服务器发送的数据发回客户端
s2.close
self.sockfd.close
sys.exit()
else:
'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的22端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',22))
s2.send(self.buf)
recv_data=s2.recv(4096)
conn.send(recv_data)
self.sockfd.close
s2.close
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口复用的关键点
s.bind((host,port))
s.listen(10)
while 1:
infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作
if len(infds)!=0:
conn,(addr,port)=s.accept()
print 'connected by',addr,port
data=conn.recv(1024)
t=Thread(data,conn)
t.start()
s.close
#coding=utf-8
import socket
import sys
import select
import threading
host='192.168.99.100'
port=80
class Thread(threading.Thread):
def __init__(self,buf,sockfd):
threading.Thread.__init__(self)
self.buf=buf
self.sockfd=sockfd
def run(self):
if len(self.buf)!=0:
if 'GET' in self.buf : #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',80))
s2.send(self.buf)
bufer=''
while 1:
recv_data=s2.recv(1024)
bufer+=recv_data
if len(recv_data)==0:
break
print bufer,len(bufer)
if len(bufer)==0:
pass
self.sockfd.send(bufer) #将服务器发送的数据发回客户端
s2.close
self.sockfd.close
sys.exit()
else:
'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的22端口
s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.connect(('127.0.0.1',22))
s2.send(self.buf)
recv_data=s2.recv(4096)
conn.send(recv_data)
self.sockfd.close
s2.close
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口复用的关键点
s.bind((host,port))
s.listen(10)
while 1:
infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作
if len(infds)!=0:
conn,(addr,port)=s.accept()
print 'connected by',addr,port
data=conn.recv(1024)
t=Thread(data,conn)
t.start()
s.close
例子2
import socket
tcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#在绑定前调用setsockopt让套接字允许地址重用
tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
#接下来两个套接字都也可以绑定到同一个端口上
tcp1.bind(('0.0.0.0', 12345))
tcp2.bind(('0.0.0.0', 12345))
import socket
tcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#在绑定前调用setsockopt让套接字允许地址重用
tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
#接下来两个套接字都也可以绑定到同一个端口上
tcp1.bind(('0.0.0.0', 12345))
tcp2.bind(('0.0.0.0', 12345))
例子3
重定向
import socket,os
bufLen = 4*1024
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock1.bind(('192.168.168.100', 8000))
sock1.listen(5)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock2.connect(('192.168.168.100', 12345))
while True:
connection,address = sock1.accept()
buf = connection.recv(bufLen)
#print buf
sock2.send(buf)
connection.send(sock2.recv(bufLen))
connection.close()
import socket,os
bufLen = 4*1024
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock1.bind(('192.168.168.100', 8000))
sock1.listen(5)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock2.connect(('192.168.168.100', 12345))
while True:
connection,address = sock1.accept()
buf = connection.recv(bufLen)
#print buf
sock2.send(buf)
connection.send(sock2.recv(bufLen))
connection.close()


猜你喜欢
- GO项目目录解释src存放源代码pkg编译后生成的文件bin编译后生成的可执行文件背景在src目录下,新建文件test.go,编写代码。控制
- 本文实例讲述了python实现ip代理池功能。分享给大家供大家参考,具体如下:爬取的代理源为西刺代理。用xpath解析页面用telnet来验
- 一、简介1、概述因为信息是展现在命令行中的,众所周知,命令行展现复杂的文本看起来着实累人,于是就想着能像表格那样展示,那看起来就舒服多了。p
- Gradio 是做什么的?先决条件:Gradio 需要 Python 3.7 或更高版本,仅此而已!gradio.app/quickstar
- python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认
- 在使用Django做前端后端项目时,登陆认证方法往往使用的是jwt_token,但是想自定义登陆成功和失败的返回体。1.当用户名和密码正确就
- 1、 在sublime text的官网下载,是适合自己系统的版本。官网地址:https://www.sublimetext.com/32、安
- 本文实例讲述了Python实现的查询mysql数据库并通过邮件发送信息功能。分享给大家供大家参考,具体如下:这里使用Python查询mysq
- 一、什么是事务?数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。二、事务的四大属性分别是原
- 1。如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就需要使用SSH隧道来加密该连接的通信。 2。用set password语句
- 更新多个对象例如说我们现在想要将Apress Publisher的名称由原来的”Apress”更改为”Apress Publishing”。
- 安装pyserialpip install pyserial查看可用的端口# coding:utf-8import serial.tools
- 1. 原理图2. 说明JS 中用来存储待执行回调函数的队列包含 2 个不同特定的列队宏列队:用来保存待执行的宏任务(回调),比如:定时器回调
- 前言在github中经常可以看到下面的日历图,可以用来表示每一天在github上的活跃程度。类似的方法也可以用到空气质量的可视化方式中来,只
- 1._thread.start_new_thread(了解)import threadingimport timeimport _threa
- 我们知道,做web开发,在调试时需要反复启动整个工程,那么上一个工程占用的端口,在下一次工程启动时就不能用了,因为占用的端口没有释放,但是手
- 描述Python 字典(Dictionary) copy() 函数返回一个字典的浅复制。语法copy()方法语法:dict.copy()返回
- 万维网联盟(W3C)发布了HTML 5规格说明书的草稿 ,这是自HTML 4在十多年前发布以来的第一个主要的修订版.在这期间,随着开发者逐渐
- 我们知道**代表次方。如下>>>12 * 12144>>>12 ** 2144>>>a
- 本文实例讲述了JS实现水平遍历和嵌套递归操作。分享给大家供大家参考,具体如下:程序中存在着一些有意思的逻辑,比如多层嵌套可以用递归遍历,比如