TCP IP套接字和多线程

时间:2017-03-18 20:27:07

标签: python multithreading sockets tcp

我正在开展以下项目:我创建了一个TCP IP客户端(WPF GUI)和一个TCP IP服务器(Python)。此问题的焦点在于服务器。此刻,我能够从客户端向服务器发送消息,服务器将消息发送回客户端。

这个过程和我想要的结果:

  • 客户端:向服务器发送基于事件的消息(例如,当按钮时 状态已更改)

  • 服务器:当服务器收到来自客户端的消息时, 服务器应该不断向客户端发送数据(例如发送数据) 每秒向客户端传输当前传感器值)。服务器应该 也能够对来自客户端的新消息做出反应并做一些事情 其他的东西。

问题:

  • paralelle进程:服务器等待传入消息并且无法进行 做其他事情(data = conn.recv(1024))。所以我无法发送 多条消息回到客户端。

我的第一个想法是使用两个线程:

  1. 从客户
  2. 接收数据
  3. 向客户发送多个数据
  4. MainLoop:启动线程,做其他事情
  5. 我的问题:我是否正确使用线程?我在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()
    

2 个答案:

答案 0 :(得分:0)

线程可以工作,也可以使用非阻塞套接字。看看这个:https://docs.python.org/2/howto/sockets.html

〜专利

答案 1 :(得分:0)

您可以使用当前阻止方法或进行异步。我更喜欢异步方法,但阻塞解决方案对您来说可能更清晰,因为您不熟悉TCP和线程。顺便说一句,使用异步,您不需要额外的线程,大多数操作都将由回调处理。

阻止解决方案:你是对的,需要3个线程。

  • 1:主线程
    • 启动其他线程,配置,控制台,数据处理等。
  • 2:发件人帖子
    • 线程只是坐着并侦听同步队列。同步队列是线程安全的,因此您不需要其他互斥锁或锁。它不会导致死锁和其他奇怪的情况。
    • 当一个新的数据包(要发送)被排队时,这个线程将处理它并继续处理其他数据包(如果存在)或者只是坐下来等待下一个数据包。
  • 3:接收者帖子
    • 当有多个字节可用时,您将读取数据包并将其传递给其处理程序。
    • 如果处理程序想要将数据包发送回客户端,它会将数据包放入同步队列,并由发送方线程处理。接收方线程不会挂起并可以继续接收。

我建议你继续研究异步TCP,现在肯定是要走的路。