为何在套接字上发送消息时套接字关闭?

时间:2014-11-07 02:56:23

标签: python sockets

如果我有conn.send()行,为什么我的连接会在3个打印语句后停止?如果该行已注释掉,则连接将无限期保持打开状态。由于某些原因它正在触及异常,但我不知道为什么,而且我对python缺乏经验。

server.py:

import random
import signal
import socket
import struct
import sys
import time

PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', PORT))
s.listen(1)
print("Server started on port %u" % PORT)

try:
    while True:
        (conn, addr) = s.accept()
        conn.setblocking(0)
        print("Client connected: %s:%d" % addr)
        while True:
            print "hey"
            conn.send("random")
            time.sleep(1)
except:
    s.close()
    print "exception"

client.py:

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 1234                 # Reserve a port for your service.

s.connect((host, port))
print s.recv(1024)
s.close

1 个答案:

答案 0 :(得分:0)

此行为的原因是套接字实际上是在客户端recv()之后关闭的,您的服务器直到第三次尝试send()时才意识到它。在您的客户端中调用close()没有改变任何东西,因为之前程序正在终止,无论如何都关闭了套接字。 This thread解释了为什么这很可能发生了什么。要测试此理论,您可以在关闭套接字之前尝试让客户端休眠(或select)并打印更多recv()个调用。