我认为您正试图让程序充当客户端或服务器,只是将 s.send() 更改为 conn.send() 遗憾的是,这并不是那么简单。
套接字初始化
必须在发送或接收数据之前初始化套接字。
对于客户来说,通常是这样的。
send_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
send_socket.connect((serverIp, serverPort)) # Connect to the server
send_socket.send(data) # Send the data to the server
对于服务器来说就像这样:
listen_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
listen_socket.bind(("0.0.0.0", port)) # Set the socket to accept client from every interface on the port port
listen_socket.listen(1) # Put the server on listen on the port setted before
accept_socket, addr = self.listen_socket.accept() # when a client connect return the socket to talk with it
data = self.accept_socket.recv(buffer_size) # Receive data form the client of max size buffer_size
文档示例
根据你的问题,我猜你在谈论s.send() 和conn.send()
this example from the python 2.7 socket docs
这里有四个使用 TCP/IP 协议的最小示例程序:一个服务器回显它收到的所有数据(仅服务一个客户端),以及一个使用它的客户端。请注意,服务器必须执行序列 socket()、bind()、listen()、accept()(可能重复 accept() 以服务多个客户端),而客户端只需要序列 socket()、connect ()。另请注意,服务器不会在它正在侦听的套接字上 sendall()/recv(),而是在 accept() 返回的新套接字上发送。
客户
回显客户端程序
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
客户端非常直接,它创建了套接字s,然后在使用s.connect() 之后,它只是通过它发送数据。
服务器
服务器一是有s和conn的地方
回显服务器程序
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
首先,我们创建一个套接字s,服务器将在该套接字上侦听,然后使用s.accept(),它将等待客户端连接到服务器,然后返回conn,这是已连接的客户端。
所以要向客户端接收或发送数据,您必须使用conn。
注意事项
正如这两个示例中的文档所述,服务器只接受一个客户端。因此,如果您要处理多个客户端,则必须重复 accept 步骤,并可能为每个客户端生成一个新线程,以便其他客户端不必相互等待。