我在Python 3.5.0上使用了你的代码,并做了一点修改,它可以正常工作:
我认为关键在于sock.accept()
方法,它返回一个元组:
socket.accept() 接受一个连接。套接字必须绑定到一个地址并且正在监听连接。 返回值是一个二元组 (conn, address) ,其中 conn 是一个新的套接字对象, 可以用来在连接上传输数据,address 是在连接的另一端绑定到套接字的地址。
#server
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.bind(("localhost", 8081))
>>> sock.listen(2)
>>> conn, addr = sock.accept()
>>> data= conn.recv(1024).decode("ascii")
#client
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.connect(("localhost",8081))
>>> sock.send("hi".encode())
2
>>> sock.send("hiiiiiii".encode())
8
>>> sock.send(("#"*1020).encode())
1020
handle_client
函数中,我写成了 server.recv
而不是 conn.recv
,导致 server.py
程序试图从自己这边接收数据。
以下是更正后的版本:
server.py
:
import socket
import threading
def handle_client(conn, addr):
while True:
msg_length = conn.recv(64).decode("utf-8") # I got the error when I put server.recv
if msg_length:
msg = conn.recv(int(msg_length)).decode('utf-8') # Here too
print(msg)
def start():
server.listen()
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((socket.gethostbyname(socket.gethostname()), 5050))
start()
client.py
:
import socket
import threading
def send(msg):
client.send(str(len(msg)).encode('utf-8').ljust(64))
client.send(msg.encode('utf-8'))
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((socket.gethostbyname(socket.gethostname()), 5050))
send("Hello world!")