由于业务需求,用做了一套client-server上传接收服务
上传和接收分别处在A、B两个城市,(A城市有多个客户端,B城市只有1个客户端)
每天A城市自动收集处理文件,并自动向B城市上传(每个客户端的上传时间不同)
B城市服务器端接收到文件先判断该数据来自哪一个客户端,然后进行对应的存档任务
几百个文件,刚开始相安无事,一切顺利
近期发现接收服务经常故障宕机
1、查询日志发现是文件上传过程中由于client端主动断开服务导致的,
解决方法:捕捉该异常,过滤掉
try:
data1 = sock.recv(1024)
except Exception as e:
if '远程主机强迫关闭' in str(e):
break
elif 'Connection reset by peer' in str(e):
break
else:
print('this is new error---{}'.format(str(e)))
break
data1 = sock.recv(1024)
2、查询日志发现client端ip地址在不断的变化(实际上应该是固定的)还有国外的地址
原因应该是client端开启的越界番羌,
解决方法:提示对方关闭
但是业务需要,有时对方经常开了忘记关
解决方法2:server端绑定client端ip,拒绝其他ip
但事实发现这种绑定方法无效
怎么办呢?
设置一个白名单,将这些ip放进一个列表,当新的连接过来时,判断是否在白名单中,如果在,继续任务,如果不在,断开,等待下一个
ip_list = [
'221.22.3.15'
'221.22.3.16'
'221.22.3.17'
'221.22.3.18'
]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8020))
s.listen()
while 1:
count = 0
sock, addr = s.accept()
print('Accept new connection from %s:%s...' % addr)
a, b, c, h, m = get_time()
print('{}{}{}{}{}'.format(a,b,c,h,m))
s_time = time.time()
while True:
if count == 0:
try:
ip = addr[0]
except Exception as e:
print('ip is error---{}'.format(str(e)))
break
if ip not in ip_list:
break
else:
count += 1
else:
try:
data1 = sock.recv(1024)
绑定ip的几种情况
1、监听所有ip,运行所有主机连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8020))
2、本地测试,只允许自己连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8020))
3、指定一个ip连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('123.321.456.654', 8020))
4、允许多个指定的ip连接
参考上面的方法