账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python udp socket 一个client线程只能”发送-接收“一次
    43
    0

    client端多线程用udp socket发送多次数据,但是一个线程只能”发送-接收“一次。

    Linux 下

    相关代码

    class mydo(threading.Thread):

    def __init__(self, id, count):
        super(mydo, self).__init__()
        self.count = count
        self.id = id
    def run(self):
        while self.count > 0:
            self.count -= 1
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            request = json.dumps({"Request": ["setMessage", "Hello Shuai!!"]})
            sock.sendto(request, ('127.0.0.1', 8080))
            tmp = sock.recvfrom(1024)
            print(self.count, tmp)
            sock.close()
    numOfThreads = 1
    threads = []
    count = 500
    for i in range(numOfThreads):
        t = mydo(i, count)
        threads.append(t)
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    

    输出是(0, ('"Successfully!"', ('127.0.0.1', 8080)))

    也就是当count变为0的时候才输出结果,然后服务器也只收到一个请求

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 在Python中,可以使用socket库的server类来创建一个UDP服务器,然后创建一个Client线程来与服务器进行通信。然而,由于UDP是无连接的,所以一个Client线程只能"发送-接收"一次。

      以下是一个简单的例子:

      ```python import socket

      class ClientThread(threading.Thread): def init(self, client_socket, callback): threading.Thread.init(self) self.client_socket = client_socket self.callback = callback

      def run(self):
          try:
              while True:
                  data = self.client_socket.recv(1024)
                  if not data:
                      break
                  self.callback(data)
          except socket.timeout:
              pass
      

      if name == 'main': client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client_socket.bind(('localhost', 12345)) client_socket.listen(1)

      callback = lambda data: print(data)
      
      client_thread = ClientThread(client_socket, callback)
      client_thread.start()
      

      ```

      在这个例子中,ClientThread线程会不断地从服务器接收数据,直到接收到数据结束为止。如果服务器在接收数据时出现连接超时,那么ClientThread线程就会等待一段时间,然后重新尝试连接。

    更多回答
    扫一扫访问手机版