如何解决与插座WSS协议的主机名?
我试过,但失败:
import socket
使用套接字解析wss协议的主机名?
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = socket.gethostbyname('wss://domain.tld')
1
A
回答
3
wss://domain.tld
不是一个主机名,这是一个URL。你不能使用套接字解析URL,你必须将其解析为一个URL来获取主机名,然后你可以解决这个问题。无论该方案是wss,http还是rsync;任何具有netloc
字段的方案都将以相同的方式工作。
例如,使用urllib.parse
:
>>> from urllib.parse import urlparse # in 2.x it's from urlparse
>>> url = 'wss://domain.tld'
>>> bits = urllib.parse.urlparse(url)
>>> netloc = bits.netloc
>>> netloc
'domain.tld'
因此,我们就大功告成了,对不对?
都能跟得上。 A netloc
可以是主机,也可以是主机:端口。而且您不能仅仅使用split(':')
,因为IPv6地址可以在其中包含冒号 - 但前提是它们被括在括号中。因此,要获得一个netloc
的host
一部分,你需要做的是这样的:
>>> host, _, port = netloc.rpartition(':')
>>> if ']' in port: host = netloc
>>> host
'domain.tld'
现在我们都完成,我们已经有了一个主机名或IP地址,我们可以通过socket.gethostbyname
。对
但一对夫妇的音符。
首先,你并不需要创建一个socket.socket
对象调用gethostbyname
;它是模块上的顶层函数,不需要任何套接字对象。
其次,gethostbyname
不适用于IPv6,并且即使在IPv4上也有一些限制,因此您可能想使用getaddrinfo
代替。
所以,整理起来:
>>> import socket
>>> addresses = socket.getaddrinfo(host, None) # or host, port if you prefer
gaierror: [Errno 8] nodename nor servname provided, or not known
嗯,这是可以预料的,因为我们的主机名是domain.tld
,而且也没有这样的领域。但是,如果我们使用的,比方说,www.google.com
,我们会得到一个几十个IPv4地址的一个很好的列表,如果你的系统有IPv6连接,一对夫妇的IPv6者为好。您可以只使用第一个,或者更喜欢IPv4到IPv6,反之亦然,或者在其他某个字段上进行区分。 (你也可以通过将更多参数传递给getaddrinfo
来在各个领域进行过滤。)
相关问题
- 1. 使用ajp协议连接到备用备用主机别名
- 2. Perl套接字在Linux下如何解析主机名?
- 3. 的Java套接字直接协议
- 4. 解析域名/主机名字符串
- 5. 如何使用NSStream连接到主机名有附加路径的wss套接字?
- 6. 套接字正确的主机名PHP
- 7. 使用代理解析主机名
- 8. 使用t-sql解析主机名称
- 9. AF_UNIX套接字的默认协议
- 10. 简单的Java TCP套接字协议
- 11. 在没有协议时匹配字符串上的主机名://?
- 12. 如何使用Zend 2 url helper添加主机名和协议?
- 13. 路由器使用什么协议来确定主机名?
- 14. 使用dart:io使用wss://协议(SSL)的WebSocket
- 15. 在winsock中检索套接字协议
- 16. 套接字(Websockets),端口和协议
- 17. 原始套接字 - 网际协议层
- 18. 套接字:协议不支持错误
- 19. 套接字通信协议/标准
- 20. 协议错误套接字服务器
- 21. Windows主机名称解析
- 22. 无法解析主机名
- 23. WinSock2 getaddrinfo解析主机名
- 24. Graylog不解析主机名
- 25. 协议解析在C
- 26. 在IIS上使用MSMQ协议配置WCF服务 - 无效的URI:无法解析主机名
- 27. 如何在Java中使用套接字和主机名?
- 28. 套接字直接协议错误:“协议地址族不支持”
- 29. 未知协议:WSS:在Socket.IO在Android中
- 30. 如何使用“iphone套接字”编程通信协议?
嘿男人,你让我的一天!谢谢... –
我知道一些关于套接字编程:)并感谢提醒我我不需要创建套接字对象。只是复制了...我写了一个代理服务器,现在它无法处理网络socket.anyway谢谢 –
@SoroushKhosravi:是的,如果你想谈谈一个wss服务器,你需要创建或安装一个WebSocket客户端库或WebSocket代理。这是一个完全不同的问题。所以是不是个好地方,以获得帮助采摘库或代理(但在维基百科开始,[这里](http://en.wikipedia.org/wiki/Websockets)和[这里](HTTP:// EN .wikipedia.org /维基/ Comparison_of_WebSocket_implementations),当然还有[PyPI中(https://pypi.python.org/pypi?%3Aaction=search&term=websocket&submit=search)如果你想要去图书馆路线)。 – abarnert