python recv永远不会抛出错误

时间:2015-03-27 17:30:25

标签: python sockets amazon-ec2

这是服务器端的示例套接字(取自某些网站):

import socket
import sys

HOST = ''   # Symbolic name, meaning all available interfaces
PORT = 10001 # Arbitrary non-privileged port

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print 'Socket created'

#Bind socket to local host and port
try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

print 'Socket bind complete'

#Start listening on socket
s.listen(10)
print 'Socket now listening'

#now keep talking with the client
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])
    conn.send("Test Messag")

s.close()

这是客户端的代码:

import socket
s=socket.socket()
s.connect((ipaddress,port))
s.setblocking(1)
import time
counter = 0
while True:
    print counter
    chunk = s.recv(11,socket.MSG_WAITALL)
    if not chunk:
        raise Exception('Socket error')
    print chunk
    time.sleep(1)
    counter += 1

服务器端代码在亚马逊ec2实例上运行(基于amazon linux ami) 当我终止实例时,我希望套接字上的recv方法会引发错误,但事实并非如此。无论我做什么,它都不会抛出错误。当我在ipython笔记本中运行服务器端代码并​​重新启动内核时,recv方法解锁并继续返回空字符串(根据When does socket.recv() raise an exception?这应该是干净关闭的情况),但不会抛出错误。

原因可能是什么,我真的需要让它抛出一个异常,所以我可以通知我的其余代码服务器因为启动一个新服务器而停止运行。

2 个答案:

答案 0 :(得分:1)

  

当我终止实例时,我希望套接字上的recv方法引发错误......

当服务器终止时,它会对套接字进行干净关闭,因此在客户端没有任何例外。要获得您想要的内容,您必须在应用程序中实现某种关闭消息。然后,您可以通过套接字关闭来区分正确的关闭(使用显式关闭消息)。

答案 1 :(得分:0)

您只进行一次tcp连接。你必须提出多个请求。

import socket
import time
counter = 0
while True:
    print counter
    s=socket.socket()
    try:
        s.connect((ipaddress,port))
        s.setblocking(1)
        chunk = s.recv(11,socket.MSG_WAITALL)
    except Exception as e:
        print e
        break
    print chunk
    time.sleep(1)
    counter += 1