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. 【一天一道LeetCode】#53. Maximum Subarray

    一天一道LeetCode系列 (一)题目 Find the contiguous subarray within an array (containing at least one number) w ...

  2. Gradle实现的两种简单的多渠道打包方法

    本来计划今天发Android的官方技术文档的翻译--<Gradle插件用户指南>的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了. 今天就说一下使用Gradle进行类似友盟这 ...

  3. 数据结构基础(3) --Permutation & 插入排序

    Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), ...

  4. 《java入门第一季》之类小案例(模拟用户登录)

    首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...

  5. Java集合之Vector

    Vector是矢量队列,它继承了AbstractList,实现了List. RandomAccess, Cloneable, java.io.Serializable接口. Vector接口依赖图: ...

  6. GROUP BY,WHERE,HAVING间的区别和用法

    having子句与where都是过滤语句. where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行 ...

  7. 43个优秀的Swift开源项目推荐

    "轮子" 工具类 项目 开发者 备注 SwiftyJSON tangplin, lingoer GitHub 上最为开发者认可的 JSON 解析类 Dollar.swift Ank ...

  8. MySql常用操作语句(2:数据库、表管理以及数据操作)

    本文主要内容转自一博文. 另外可供参考资源: SQL语句教程 SQL语法 1.数据库(database)管理  1.1 create 创建数据库 mysql> create database f ...

  9. thrift实现HDFS文件操作

    thrift 文件如下 namespace java com.pera.file.transform struct  File{     1:string path ,     2:string co ...

  10. 使用schemaExport自动生成表结构

    一.Hibernate原生状态 ? 1 2 3 4 5 Configuration cfg = new Configuration().configure();   SchemaExport expo ...