我正在尝试创建一个非常简单的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()
我已经阅读了多个类似的问题,但没有人符合我的问题,因为他们都使用了更复杂的过程。 你可以看到这是一个非常简单的应用程序,它是我的第一个。
答案 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)