一. 网络链接问题
【写在前面】
阿里云跟其他的腾讯云相比有点坑爹呀。。。
今天测试时,按照之前腾讯云的骚操作只需要将对应4G路由器的设置绑定到对应的云服务器公网IP地址就行,
test code:
说明:
腾讯云公网ip:106.54.40.84:8000
腾讯云本地ip:172.17.0.14:8001
阿里云公网ip:47.110.232.228:8000
阿里云本地ip:172.16.119.1528001
import socket
import time
# _*_ coding:utf-8 _*_
'''
endstr = "end" # 重新定义结束符
str = ""
for line in iter(input, endstr): # 每行接收的东西
str += line+"\n" # 换行
print(str)
'''
server = socket.socket()
server.bind(('106.54.40.84', 8000)) # (host, port) 公网IP直接一键搞定 实际做了8000到本地IP的8001端口映射
server.listen(4) # 服务器端建立侦听,监听客户端的连接请求
serObj, address = server.accept()
while True:
receive_data = serObj.recv(1024).decode('gb18030')
# print('receive_data is >>', receive_data)
# receive = receive_data + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print('receive is >>', receive_data)
if receive_data == 'quit':
break
'''
if receive_data == 'qui':
send_data = input('server>>') # python3中的input默认为 string
# send_data = 'test\r\n'
send_data1 = send_data + '\r\n'
print('server>> send_data1 is >>', send_data1)
serObj.send(send_data1.encode('utf-8'))
'''
send_data = input('server>>') # python3中的input默认为 string
# send_data = 'test\r\n'
send_data1 = send_data + '\r\n'
print('server>> send_data1 is >>', send_data1)
serObj.send(send_data1.encode('utf-8'))
serObj.close()
server.close()
可是人家阿里云就是不一般
import socket
# _*_ coding:utf-8 _*_
'''
endstr = "end" # 重新定义结束符
str = ""
for line in iter(input, endstr): # 每行接收的东西
str += line+"\n" # 换行
print(str)
'''
server = socket.socket()
server.bind(('47.110.232.228', 8000)) # (host, port)
server.listen(4) # 服务器端建立侦听,监听客户端的连接请求
serObj, address = server.accept()
while True:
receive_data = serObj.recv(1024).decode('gb18030')
# print('receive_data is >>', receive_data)
# receive = receive_data + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print('receive is >>', receive_data)
if receive_data == 'quit':
break
'''
if receive_data == 'qui':
send_data = input('server>>') # python3中的input默认为 string
# send_data = 'test\r\n'
send_data1 = send_data + '\r\n'
print('server>> send_data1 is >>', send_data1)
serObj.send(send_data1.encode('utf-8'))
'''
send_data = input('server>>') # python3中的input默认为 string
# send_data = 'test\r\n'
send_data1 = send_data + '\r\n'
print('server>> send_data1 is >>', send_data1)
serObj.send(send_data1.encode('utf-8'))
serObj.close()
server.close()
阿里云直接报错:
winerror 10049
解决方法
1:IP地址查看:
- 本地主机地址:
ipconfig指令
- 公网IP地址:
curl httpbin.org/ip
各方查证,结论如下:
阿里云 有两种网络
①经典网络
②专有网络
经典网络可以直接绑定公网IP,
专有网络不能直接绑定公网IP
(客服是这么讲的 “这不是经典网络。没有网卡所有TCP协议无法使用”)
socket服务端要写阿里云私有地址,客户端要写公有地址
socket服务端要写阿里云私有地址,客户端要写公有地址
socket服务端要写阿里云私有地址,客户端要写公有地址
测试有效,完美解决
参考 https://blog.csdn.net/u014043213/article/details/80228495#commentBox(看完之后觉得没啥用)
完美解决方案:
http://www.usr.cn/Faq/405.html
解决方法:
- 通过阿里云的服务器官网添加安全组规则:
实际测试:
测试代码如下:
将公网IP换成本地私有IP 问题得到完美解决
将公网IP换成本地私有IP 问题得到完美解决
将公网IP换成本地私有IP 问题得到完美解决
import socket
# _*_ coding:utf-8 _*_
server = socket.socket()
server.bind(('47.110.232.228', 8000)) # (host, port)
server.listen(4) # 服务器端建立侦听,监听客户端的连接请求
serObj, address = server.accept()
while True:
receive_data = serObj.recv(1024).decode('gb18030')
print('receive is >>', receive_data)
if receive_data == 'quit':
break
send_data = input('server>>') # python3中的input默认为 string
# send_data = 'test\r\n'
send_data1 = send_data + '\r\n'
print('server>> send_data1 is >>', send_data1)
serObj.send(send_data1.encode('utf-8'))
serObj.close()
server.close()
测试结果: