Python回声客户端中socket.send仅工作一次

6 投票
2 回答
6434 浏览
提问于 2025-04-17 07:30

我有一段代码,用于一个回声客户端,它通过套接字连接向一个回声服务器发送数据:

echo_client.py

import socket

host = '192.168.2.2'
port = 50000
size = 1024

def get_command():
    #..Code for this here

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while 1:
    msg = get_command()
    if msg == 'turn on':
        s.send('Y')
    elif msg == 'turn off':
        s.send('N')
    elif msg == 'bye bye':
        break   
    else:
        s.send('X') 
    data = s.recv(size)
    print 'Received: ',data

s.close()

echo_server.py

import socket 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(size) 
    if data: 
        client.send(data) 
client.close()

我遇到的问题是,在客户端中,s.send 只在第一次有效,尽管它在一个无限循环中。客户端在第一次发送/接收完成后不久就崩溃,提示连接超时

为什么 s.send 只工作一次呢?我该如何在我的代码中修复这个问题?

请帮帮我,谢谢!

2 个回答

2

你的问题在于,你在服务器的循环中阻塞在了accept这个地方。

这意味着服务器在等待接收来自多个客户端的连接。如果你想要这样做,并且希望每个客户端可以发送多个命令,那么你需要在接收到连接后,开启一个新的线程(或者进程),在那个线程/进程中再用一个新的循环来处理与客户端的通信。

如果你想让你的例子只处理一个客户端,你需要把accept放到循环外面,像这样:

client, address = s.accept() 
while 1: 
    data = client.recv(size) 
    if data: 
        client.send(data) 
5

你的服务器代码只调用了一次 recv。如果你只想接收一个连接,应该只调用一次 accept,但是之后你需要不断地循环调用 recvsend

撰写回答