2017-12-28 12 views
0

나는 간단한 클라이언트와 파이썬에서 서버 코딩, 나는 이해하고 클라이언트를 실행하는 데 아무런 문제가 없다 그러나 나는 문제의 이해와 서버를 실행 있습니다. 들어오는 연결을 수락하기위한 두 가지 변수는 무엇입니까?

잘 작동 클라이언트 내 코드입니다 : 지금 여기 당신이 알 내 서버 여기

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

host = 'localhost' 
port = 12345 

sock.connect((host, port)) 
data = sock.recv(1024) 
sock.close() 
print("Message: ", data) 
print("Finished successfully") 

하고 그 sock.accept()이 두 변수가 앞면 연결 & addr 그리고 그게 내가 이해하려고하는 것입니까? 왜이 두 변수가 있어야합니까? 왜 내가 가질 수 없어? 같은 기능으로 할당 된 두 개의 변수가 필요한 이유는 무엇입니까? 이 코드를 실행하면 잘 작동 :

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

host = 'localhost' 
port = 12345 

sock.bind((host, port)) 
sock.listen(5) 

while True: 
    print("Waiting for a connection...") 
    connection, addr = sock.accept() 
    #print("Incomming connection from", addr) 
    msg = b'This is a test.' 
    connection.send(msg) 
    connection.close() 
    break 
print("Finished successfully") 

을하지만 나는 하나 개의 변수를 제거하면, 이제 요지을 가정 해 봅시다 :

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

host = 'localhost' 
port = 12345 

sock.bind((host, port)) 
sock.listen(5) 

while True: 
    print("Waiting for a connection...") 
    connection = sock.accept() 
    #print("Incomming connection from", addr) 
    msg = b'This is a test.' 
    connection.send(msg) 
    connection.close() 
    break 
print("Finished successfully") 

그리고 나는이 코드를 실행, 나는 오류가? 왜이 오류가 발생합니까?

Traceback (most recent call last): 
    File "server.py", line 16, in <module> 
    connection.send(msg) 
AttributeError: 'tuple' object has no attribute 'send' 

저는이 논리를 이해하지 못합니까? 이 두 변수에는 동일한 기능이 할당되어 있으며 동일한 기능을 수행하는 두 개의 동일한 변수가 있어야하는 이유가 표시되지 않습니다.

+0

asign이 개 변수 내가 아니었다 2 개 요소 –

+0

을 튜플 풀고 바로 파이썬 방법입니다, 당신은 당신이 socket.accept()이 그렇지 않으면 당신은 튜플 객체를받을 사용할 때마다 값을 압축을 풀 필요가 의미 정말 그 사실을 알고, 나는 아직 파이썬을 배우고 있고 분명히 아직 모든 개념을 이해하지 못했다 :)) – CrypticX

답변

0

이 때문에 문서 당과 같습니다

socket.accept() 

가 연결을 수락합니다. 소켓은 주소에 바인드되어 연결을 청취해야합니다. 반환 값은 쌍 (conn, address)입니다. 여기서 conn은 연결에서 데이터를 보내고받을 수있는 새 소켓 객체이고 address는 연결의 다른 끝에있는 소켓에 바인딩 된 주소입니다.

는 너무

conn, address = socket.accept() # correct way 
conn = socket.accept() # incorrect since conn here is a tuple 
+0

'conn = socket.accept()'여전히 맞지만 나중에 언팩해야한다. –

+0

네, 여전히 맞습니다. 하지만 그는 포장을 풀지 않고 직접 사용합니다. – johnII

관련 문제