2014-11-07 2 views
1

conn.send() 행이있는 경우 인쇄가 3 번 인쇄 된 후 연결이 중단되는 이유는 무엇입니까? 해당 행을 주석 처리하면 연결이 계속 열려 있습니다. 어떤 이유로 예외가 발생하지만, 이유와 필자는 파이썬에 익숙하지 않습니다.소켓을 통해 메시지를 보낼 때 소켓이 닫히는 이유는 무엇입니까?

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 
+0

'client.py'의 마지막 줄에 괄호가 없습니다. 실제로 실행중인 코드에 있는지 여부에 관계없이 결과에 영향을 줄 수 있습니다. – ErlVolton

+0

@ErlVolton은 불행하게도 아무 것도 바뀌지 않았습니다. –

+0

여전히''hey "'를 3 번 ​​인쇄합니까? – ErlVolton

답변

0

이 동작에 대한 이유는 소켓이 실제로 고객 첫번째 recv() 후 폐쇄하고, 서버가 단지 실현하지 않습니다 세 번째 시도가 send()이 될 때까지 클라이언트에 close()을 호출해도 이전에는 프로그램이 종료 되었기 때문에 아무 것도 변경되지 않았습니다. 어쨌든 소켓을 닫았습니다. This thread은 왜 이런 일이 일어나고 있는지 설명합니다. 이 이론을 테스트하려면 소켓을 닫기 전에 클라이언트를 잠자기 (또는 select)하고 recv() 전화를 더 인쇄하십시오.

관련 문제