我正在开展以下项目:我创建了一个TCP IP客户端(WPF GUI)和一个TCP IP服务器(Python)。此问题的焦点在于服务器。此刻,我能够从客户端向服务器发送消息,服务器将消息发送回客户端。
这个过程和我想要的结果:
客户端:向服务器发送基于事件的消息(例如,当按钮时 状态已更改)
服务器:当服务器收到来自客户端的消息时, 服务器应该不断向客户端发送数据(例如发送数据) 每秒向客户端传输当前传感器值)。服务器应该 也能够对来自客户端的新消息做出反应并做一些事情 其他的东西。
问题:
我的第一个想法是使用两个线程:
我的问题:我是否正确使用线程?我在TCP IP和使用线程方面没有太多经验。谢谢您的帮助。
我目前的服务器代码:
from threading import Thread
import socket
data =''
HOST ='192.168.0.108' # Server IP or Hostname
PORT = 12345 # Pick an open Port (1000+ recommended), must match the client sport
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
def ReceiveAndSendData():
#managing error exception
try:
s.bind((HOST, PORT))
except socket.error:
print 'Bind failed '
print 'Wait for connection'
s.listen(5)
(conn, addr) = s.accept()
print 'Connected'
# awaiting for message
while True:
print'start'
try:
print 'awaiting data from GUI'
if not data: break
data = conn.recv(1024)
print 'Received data: ' + data
reply = 'Received data'
conn.send(reply)
except socket.error:
print 'Connection lost'
print 'Wait for connection'
s.listen(5)
(conn, addr) = s.accept()
print 'Connected'
conn.close() # Close connections
def Main():
t1 = Thread(target=ReceiveAndSendData)
t1.start()
print 'DoSomething'
if __name__ == '__main__':
Main()
答案 0 :(得分:0)
线程可以工作,也可以使用非阻塞套接字。看看这个:https://docs.python.org/2/howto/sockets.html
〜专利
答案 1 :(得分:0)
您可以使用当前阻止方法或进行异步。我更喜欢异步方法,但阻塞解决方案对您来说可能更清晰,因为您不熟悉TCP和线程。顺便说一句,使用异步,您不需要额外的线程,大多数操作都将由回调处理。
阻止解决方案:你是对的,需要3个线程。
我建议你继续研究异步TCP,现在肯定是要走的路。