2

我是堆栈溢出和套接字编程的新手。在此先感谢您的帮助!

一点背景:我正在尝试实现一个简单的 python 服务器。我正在尝试通过 TCP 连接,并且只是尝试从请求中返回一些已解析的文本(我正在尝试发回文本变量“消息”)。

但是,似乎即使在我关闭连接之后,服务器端套接字也会接受一些名为“/favicon.ico”的随机输入,我不确定这是从哪里来的。此循环接受“/favicon.ico”几次,然后返回到等待连接的状态。

有谁知道发生了什么? 这是我的代码:

#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
serverPort = 10016
serverName = '192.168.56.101'
serverSocket.bind((serverName,serverPort))
serverSocket.listen(0)

while True:
    #Establish the connection
    print 'Ready to serve...'
    connectionSocket, addr = serverSocket.accept()

    message = connectionSocket.recv(4096)
    filename = message.split()[1]
    #f = open(filename[1:])
    print filename
    connectionSocket.send(message)
    connectionSocket.close()

    print '\nYou got to this line\n'

-------------------------------------------------- ------------

这是我的客户端请求: http://192.xxx.56.101:10016/sophie.JPG(堆栈溢出让我失去了 IP)

还有我的客户端输出,似乎可以正常返回

GET /sophie.JPG HTTP/1.1
Host: 192.168.56.101:10016
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

-------------------------------------------------- ------------

这是我的服务器端输出(打印语句):

name@name-VirtualBox:~/Documents/python_scripts$ python server2.py
Ready to serve...
/sophie.JPG
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...

-------------------------------------------------- --------------------

我本来希望输出只是前四行:

Ready to serve...
/sophie.JPG
You got to this line
Ready to serve...

--------

我希望只有这四行返回,因为在连接关闭后服务器应该返回到它的等待状态。但是,它仍在接受一些名为/favicon.ico的输入,并在返回等待状态之前再循环运行几次。

有没有人知道这里发生了什么?

谢谢!

--------------------------------------

更新:

好的,所以我添加了您建议的行,并且我看到浏览器正在发送这些额外的请求并且它们(根据您)正在排队。

除此之外,我还更改了行:

serverSocket.listen(0)

serverSocket.listen(1)

然后我的代码按照我的意愿运行。(其实我现在又试了一次,并没有按预期运行。/favicon.ico请求还在发送中)

我想我对正在发生的事情有几个后续问题:

  1. 为什么浏览器在我没有要求时对/favicon.ico提出更多请求(使用原始代码 serverSocket(0)?

  2. 现在我已经允许服务器监听多个套接字连接,为什么虚假连接请求(/favicon.ico)消失了?

谢谢,我也会阅读同步 cookie。

4

2 回答 2

1

值得庆幸的是,您的服务器正在按预期工作!

在调用 serversocket.accept(): 之后,尝试将此添加到您的代码中print addr

发生的事情是这样的:

你开始你的循环,然后你调用accept()。您正在等待新连接到达端口 10016。您接收该连接,提供响应,然后关闭该连接。

然后你再次循环 - 从而准备好接受另一个套接字连接。这一次,它是针对 /favicon.ico 的。

addr变量告诉您​​每个新的套接字连接(对于 foo.jpg 和 favicon.ico)都发生在不同的端口上——这就是 accept() 所做的。

因为您的代码一次只能处理一个连接,所以浏览器对 favicon.ico 的请求进入队列。也就是说,浏览器已请求连接到您的服务器以获取图标,但您的服务器尚未接受该连接。

现在,理论上,您不应该接受任何积压的连接。但是有一个问题!事实证明,如果您的内核上启用了 TCP 同步 cookie,则此参数将被忽略。(你怎么知道的?嗯,我用 C 语言完成了一堆网络,这对我很有帮助;Python 抽象出了许多这些细节。)

希望有帮助!

于 2013-10-24T07:53:33.713 回答
1

您是否正在使用 Chrome:服务器套接字在我从 chrome 发送时收到 2 个 http 请求,在我从 firefox 发送时收到一个

我的节点服务器也有类似的问题。这是由于 Chrome 中的以下错误。总之,Chrome 会针对每个请求发送一个网站图标请求。因为,很可能,您不会发回网站图标,它会在每个合法请求之后请求一个。

Firefox 和大多数其他浏览器在第一次连接时也会发送对 favicon 的请求,但会缓存结果,即如果第一次没有返回 favicon,它们不会继续尝试 - 这就是为什么你只是看到来自 Firefox 的单个请求。不幸的是,Chrome 似乎对它的 favicon requestiness 有点过于执着了。

于 2013-10-24T07:54:52.397 回答