为什么两个变量用于接受传入连接?

问题描述 投票:0回答:1

我已经在python中编写了一个简单的客户端和服务器,我没有理解和运行客户端的问题,但我有一个问题理解和运行服务器。

这是我的客户端代码工作正常:

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")

但是,如果我删除一个变量,让我们说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 = 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'

我只是不明白这背后的逻辑?这两个变量分配了相同的功能,我不明白为什么我应该有两个相同的变量,能够做同样的事情?

python sockets networking
1个回答
0
投票

这是因为根据文件:

socket.accept()

接受连接。套接字必须绑定到一个地址并侦听连接。返回值是一对(conn,address),其中conn是可用于在连接上发送和接收数据的新套接字对象,address是绑定到连接另一端的套接字的地址。

这意味着你需要在使用socket.accept()时解压缩值,否则你会收到一个元组对象,所以

conn, address = socket.accept() # correct way
conn = socket.accept() # incorrect since conn here is a tuple
© www.soinside.com 2019 - 2024. All rights reserved.