sockMiddle_server.py

 import sys
import socket
import threading #回复消息,原样返回
def replyMessage(conn):
while True:
data = conn.recv(1024)
conn.send(data)
if data.decode().lower() == 'bye':
break
conn.close() def main():
sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockScr.bind(('', port))
sockScr.listen(200)
while True:
try:
conn, addr = sockScr.accept()
#只允许特定主机访问本服务器
if addr[0] != onlyYou:
conn.close()
continue
#创建并启动线程
t = threading.Thread(target=replyMessage, args=(conn,))
t.start()
except:
print('error') if __name__ == '__main__':
try:
#获取命令行参数
port = int(sys.argv[1])
onlyYou = sys.argv[2]
main()
except:
print('Must give me a number as port')

sockMiddle.py

 import sys
import socket
import threading def middle(conn, addr):
#面向服务器的Socket
sockDst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockDst.connect((ipServer,portServer))
while True:
data = conn.recv(1024).decode()
print('收到客户端消息:'+data)
if data == '不要发给服务器':
conn.send('该消息已被代理服务器过滤'.encode())
print('该消息已过滤')
elif data.lower() == 'bye':
print(str(addr)+'客户端关闭连接')
break
else:
sockDst.send(data.encode())
print('已转发服务器')
data_fromServer = sockDst.recv(1024).decode()
print('收到服务器回复的消息:'+data_fromServer)
if data_fromServer == '不要发给客户端':
conn.send('该消息已被代理服务器修改'.encode())
print('消息已被篡改')
else:
conn.send(b'Server reply:'+data_fromServer.encode())
print('已转发服务器消息给客户端') conn.close()
sockDst.close() def main():
sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockScr.bind(('', portScr))
sockScr.listen(200)
print('代理已启动')
while True:
try:
conn, addr = sockScr.accept()
t = threading.Thread(target=middle, args=(conn, addr))
t.start()
print('新客户:'+str(addr))
except:
pass if __name__ == '__main__':
try:
#(本机IP地址,portScr)<==>(ipServer,portServer)
#代理服务器监听端口
portScr = int(sys.argv[1])
#服务器IP地址与端口号
ipServer = sys.argv[2]
portServer = int(sys.argv[3])
main()
except:
print('Sth error')

sockMiddle_client.py

 import sys
import socket
import threading def middle(conn, addr):
#面向服务器的Socket
sockDst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockDst.connect((ipServer,portServer))
while True:
data = conn.recv(1024).decode()
print('收到客户端消息:'+data)
if data == '不要发给服务器':
conn.send('该消息已被代理服务器过滤'.encode())
print('该消息已过滤')
elif data.lower() == 'bye':
print(str(addr)+'客户端关闭连接')
break
else:
sockDst.send(data.encode())
print('已转发服务器')
data_fromServer = sockDst.recv(1024).decode()
print('收到服务器回复的消息:'+data_fromServer)
if data_fromServer == '不要发给客户端':
conn.send('该消息已被代理服务器修改'.encode())
print('消息已被篡改')
else:
conn.send(b'Server reply:'+data_fromServer.encode())
print('已转发服务器消息给客户端') conn.close()
sockDst.close() def main():
sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockScr.bind(('', portScr))
sockScr.listen(200)
print('代理已启动')
while True:
try:
conn, addr = sockScr.accept()
t = threading.Thread(target=middle, args=(conn, addr))
t.start()
print('新客户:'+str(addr))
except:
pass if __name__ == '__main__':
try:
#(本机IP地址,portScr)<==>(ipServer,portServer)
#代理服务器监听端口
portScr = int(sys.argv[1])
#服务器IP地址与端口号
ipServer = sys.argv[2]
portServer = int(sys.argv[3])
main()
except:
print('Sth error')
'''
启动3个终端cd到文件目录后:各终端执行一条语句
python sockMiddle_server.py 10000 10.2.1.2
python sockMiddle.py 30800 10.2.1.2 10000
python sockMiddle_client.py 10.2.1.2 30800
'''

Python_NAT的更多相关文章

随机推荐

  1. 【64】Spring mvc详解

    Spring mvc框架 Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活.松散耦合的 web 应用程序的组件.MVC 模式导致了应用程序的不同方面(输入逻辑.业务 ...

  2. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. OBJ-C中dispatch_once的用法

    见如下代码: +(GameState*)sharedGameState{ static GameState *sharedInstance; static dispatch_once_t onceTo ...

  4. Android Data Binding语法解析(二)

    上篇我们知道了Data Binding的最简单的用法,那么Data Binding其中最为重要也是最复杂的其实就是在xml布局文件中给对应的控件进行数据绑定了,接下来就一一说明Data Binding ...

  5. JDBC详解(汇总)

    from:http://www.cnblogs.com/lee/archive/2007/08/25/869656.html:http://blog.csdn.net/lovesomnus/artic ...

  6. ZeroC Ice Ice Registry实现负载均衡

    Registry介绍         对于多个IceBox集群该怎么负载均衡?以服务注册表Registry为依托的Service Locator组件,以及依赖其而诞生的强大的分分布式框架-IceGri ...

  7. hadoop分布式安装部署详细视频教程(网盘附配好环境的CentOS虚拟机文件/hadoop配置文件)

    参考资源下载:http://pan.baidu.com/s/1ntwUij3视频安装教程:hadoop安装.flvVirtualBox虚拟机:hadoop.part1-part5.rarhadoop文 ...

  8. ES6之let命令

    ES6新增了let命令,用来声明变量.它的用法类似于var. let和var声明变量的区别: 1.let声明的变量,只在let命令所在的代码块内有效,出了这个块级作用域就不起作用 先看一个例子: { ...

  9. Oracle 报错ORA-00904:标示符无效

    写select查询,报错:ORA-00904 标示符无效 这个错误通常是因为 字段名写错了,或者是在创建表的时候,创建最后一个字段的时候也加了逗号 . 我遇到的情况时,之前的同事创建表的时候,将小写的 ...

  10. mysql6.5 操作日志

    创建用户并授权 grant all privileges on database.* to user@localhost identified by '123456'; flush privilege ...