为什么Python服务器只收到一次

时间:2014-03-09 12:27:30

标签: python sockets

我正在尝试创建一个非常简单的python服务器和一个连接到它的python客户端,但是,这是我的代码:

服务器

#!/usr/bin/env python 

""" 
A simple echo server 
""" 

import socket 
import sys

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

    if data.decode('UTF-8') is 'exit':
        client.close()
        break
sys.exit()

客户端:

#!/usr/bin/env python 

""" 
A simple echo client 
""" 

import socket 

host = 'localhost' 
port = 50000 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port))

while True:
    t = input('Enter Text: ')
    s.send(bytes(t, 'UTF-8'))
    data = s.recv(size) 
    print ('Received:', data.decode('UTF-8'))

    ans = input('Do you want to send another text? (y/n): ') 
    if ans is 'n' or ans is 'N':
        break

print ("Thank you for using my software...")
print ("Have a nice day")

s.send(bytes('exit', 'UTF-8'))
s.close() 

我已经阅读了多个类似的问题,但没有人符合我的问题,因为他们都使用了更复杂的过程。 你可以看到这是一个非常简单的应用程序,它是我的第一个。

1 个答案:

答案 0 :(得分:2)

您每个客户只收到一次数据。

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

    if data.decode('UTF-8') is 'exit':
        client.close()
        break

在此部分代码中,您使用client, address = s.accept()接受每个客户端连接,然后调用data = client.recv(size)仅从该客户端接收一次数据。

你需要做的是在最基本的层面上,产生一个新的线程来处理与客户的沟通。

client_thread = ServiceThread(client)
client_thread.start()

接受连接后添加上面的代码 - 其中ServiceThread是一个仅用于此客户端的新线程。

while True: 
        client = s.accept() 
        client_thread = ServiceThread(client)
        client_thread.start()

然后,您可以选择在该线程中对客户端执行任何操作。作为一个粗略的例子:

from threading import Thread

class ServiceThread(Thread):
    def __init__(self, client):
        Thread.__init__(self)
        self.conn = client[0]
        self.addr = client[1]

    def run(self):
        data = self.conn.recv(1024) 
        if data:
            self.conn.send(data)