2 Star 4 Fork 1

骁龙 / chuantoupython

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
server_proxy.py 2.02 KB
一键复制 编辑 原始数据 按行查看 历史
骁龙 提交于 2017-09-04 21:51 . 添加
import threading
import socket
import select
# AF_INET: 基于 IPV4 的网络通信 SOCK_STREAM: 基于 TCP 的流式 socket 通信
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 将套接字绑定到地址
s1.bind(('127.0.0.1', 2333))
# 监听TCP传入连接
s1.listen(50)
# AF_INET: 基于 IPV4 的网络通信 SOCK_STREAM: 基于 TCP 的流式 socket 通信
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 将套接字绑定到地址
s2.bind(('127.0.0.1', 8000))
# 监听TCP传入连接
s2.listen(50)
def send_data(sock, data):
#print(data)
bytes_sent = 0
while True:
r = sock.send(data[bytes_sent:])
if r < 0:
return r
bytes_sent += r
if bytes_sent == len(data):
return bytes_sent
def handle_tcp(sock, remote):
# 处理 client socket 和 remote socket 的数据流
try:
fdset = [sock, remote]
while True:
# 用 IO 多路复用 select 监听套接字是否有数据流
r, w, e = select.select(fdset, [], [])
if sock in r:
data = sock.recv(4096)
if len(data) <= 0:
break
result = send_data(remote, data)
if result < len(data):
raise Exception('failed to send all data')
if remote in r:
data = remote.recv(4096)
if len(data) <= 0:
break
result = send_data(sock, data)
if result < len(data):
raise Exception('failed to send all data')
except Exception as e:
raise(e)
finally:
sock.close()
remote.close()
while True:
con1, addr1 = s1.accept()
print("new connection1 from %s:%s" % addr1)
con2, addr2 = s2.accept()
print("new connection2 from %s:%s" % addr2)
t = threading.Thread(target=handle_tcp, args=(con1, con2))
t.start()
Python
1
https://gitee.com/wapai/chuantoupython.git
git@gitee.com:wapai/chuantoupython.git
wapai
chuantoupython
chuantoupython
master

搜索帮助