2013-12-13 37 views

回答

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地址可以在其中包含冒号 - 但前提是它们被括在括号中。因此,要获得一个netlochost一部分,你需要做的是这样的:

>>> 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来在各个领域进行过滤。)

+0

嘿男人,你让我的一天!谢谢... –

+0

我知道一些关于套接字编程:)并感谢提醒我我不需要创建套接字对象。只是复制了...我写了一个代理服务器,现在它无法处理网络socket.anyway谢谢 –

+0

@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