如果我们要检查本地网络中运行的 Web 服务器,可以使用 Python 的 socket
模块来进行网络连接测试。以下是一个简单的示例代码,演示如何检查本地网络中运行的 Web 服务器:
1、问题背景
在学习如何使用 Python 时,一位用户希望编写一段代码来检查本地网络中是否有人运行着 Web 服务器。他们使用提供的代码遇到了一些错误,因此寻求社区的帮助来解决这些问题。
以下错误代码:
#!/usr/bin/env python
import httplib
last = 1
while last <> 255:
url = "10.1.1." + "last"
connection = httplib.HTTPConnection("url", 80)
connection.request("GET","/")
response = connection.getresponse()
print (response.status)
last = last + 1
2、解决方案
方案 1:使用正确的 Python 语法和错误处理
import httplib
import socket
for i in range(1, 256):
try:
url = "10.1.1.%d" % i
connection = httplib.HTTPConnection(url, 80)
connection.request("GET","/")
response = connection.getresponse()
print url + ":", response.status
except socket.error:
print url + ":", "error!"
方案 2:使用更 Pythonic 的代码风格和错误处理
import urllib
import threading
import socket
def t_run(thread_list, chunks):
t_count = len(thread_list)
print("Running %s jobs in groups of %s threads" % (t_count, chunks))
for x in range(t_count / chunks + 1):
i = x * chunks
i_c = min(i + chunks, t_count)
c = len([t.start() for t in thread_list[i:i_c]])
print("Started %s threads for jobs %s...%s" % (c, i, i_c - 1))
c = len([t.join() for t in thread_list[i:i_c]])
print("Finished %s threads for job index %s" % (c, i))
def url_scan(ip_base, timeout=5):
socket.setdefaulttimeout(timeout)
def f(url):
# print("-- Trying (%s)" % url)
try:
# the print will only complete if there's a server there
r = urllib.urlopen(url)
if r:
print("## (%s) got %s bytes" % (url, len(r.read())))
else:
print("## (%s) failed to connect" % url)
except IOError, msg:
if str(msg)=="[Errno socket error] timed out":
return
if str(msg)=="[Errno socket error] (10061, 'Connection refused')":
return
print("## (%s) got error '%s'" % (url, msg))
return [threading.Thread(target=f, args=("http://" + ip_base + str(x) + ":" + str(p),)) for x in range(255) for p in [80, 8080]]
# run them (increase chunk size depending on your memory)
# also, try different timeouts
t_run(url_scan("209.131.36."), 100)
t_run(url_scan("209.131.36.", 30), 100)
方案 3:修复变量名中的引号
#!/usr/bin/env python
import httplib
last = 1
while last <> 255:
url = "10.1.1.%d" % last
connection = httplib.HTTPConnection(url, 80)
connection.request("GET","/")
response = connection.getresponse()
print (response.status)
last = last + 1
方案 4:移除引号并使用正确的变量名
#!/usr/bin/env python
import httplib
last = 1
while last <> 255:
url = "10.1.1." + str(last)
connection = httplib.HTTPConnection(url, 80)
connection.request("GET","/")
response = connection.getresponse()
print (response.status)
last = last + 1
通过这些解决方案,用户将能够准确地检查本地网络中是否有运行着的 Web 服务器。
我们可以将 host
参数设置为你想要检查的主机名或 IP 地址,将 port
参数设置为你所使用的 Web 服务器端口。这样,你就可以在本地网络中轻松地检查 Web 服务器是否运行。是否觉得很方便?如果有任何技术卡壳的问题都可以这里留言讨论。