【问题标题】:socket.send working only once in python code for an echo clientsocket.send 仅在 python 代码中为 echo 客户端工作一次
【发布时间】:2012-01-10 22:30:54
【问题描述】:

我有以下代码用于 echo 客户端,它使用套接字连接将数据发送到 echo 服务器

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 只工作一次?如何在我的代码中解决这个问题?

请帮忙 谢谢你

【问题讨论】:

    标签: python sockets network-programming


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,已经解决了:)
    【解决方案2】:

    您的问题是您阻塞了服务器循环内的accept

    这是期望服务器接受来自多个客户端的连接。如果您希望这样,并且对于每个客户端发送多个命令,您需要在接受之后生成一个新线程(或进程),并在该线程/进程中使用一个新的 while 循环(用于客户端通信)。

    要修复您的示例以仅与一个客户端一起使用,您需要将接受移出循环,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多