【问题标题】:TCP IP Socket and MultithreadingTCP IP 套接字和多线程
【发布时间】:2017-08-10 07:21:50
【问题描述】:

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

过程和我想要归档的内容:

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

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

问题:

  • 并行进程:服务器等待传入消息并且不能 做任何其他事情(数据= conn.recv(1024))。所以我无法发送 多条消息返回给客户端。

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

  1. 从客户端接收数据
  2. 向客户端发送多个数据
  3. MainLoop:启动线程,做其他事情

我的问题:我使用线程的方法是否正确?我在 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()

【问题讨论】:

    标签: python multithreading sockets tcp


    【解决方案1】:

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

    阻塞解决方案:你说得对,需要 3 个线程。

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

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

    【讨论】:

    【解决方案2】:

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

    ~拍拍

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多