【问题标题】:Python : How to handle multiple clients and a serverPython:如何处理多个客户端和服务器
【发布时间】:2011-01-10 18:54:52
【问题描述】:

我正在实现一个带有服务器和多个客户端的程序。所有客户端都向服务器发送数据,服务器检查每个客户端的步骤。如果所有客户端的步骤都相同,则服务器将新数据发送给所有客户端以执行下一步。它一次又一次地继续这个过程。

但是,当我运行我的程序时,它无法相互通信。这是我的代码。你能给我一些提示吗?

客户端和服务器

#client
from socket import *
from sys import *
import time
import stat, os
import glob

# set the socket parameters
host = "localhost"
port = 21567
buf = 1024
data = ''
addr = (host, port)

UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.settimeout(100)

def_msg = "=== TEST ==="

#FILE = open("test.jpg", "w+")
FILE = open("data.txt","w+")

while (1):
  #data, addr = UDPSock.recvfrom(buf)
  print "Sending"
  UDPSock.sendto(def_msg, addr)
  #time.sleep(3)
  data, addr = UDPSock.recvfrom(buf)

  if data == 'done':
   FILE.close()
   break
  FILE.write(data)

  print "Receiving"
  #time.sleep(3)

UDPSock.close()

# server program for nvt

from socket import *
import os, sys, time, glob
#import pygame
import stat

host = 'localhost'
port = 21567
buf = 1024
addr = (host, port)

print 'test server'

UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)

msg = "send txt file to all clients"

#FILE = open("cam.jpg", "r+")
FILE = open("dna.dat","r+")
sending_data = FILE.read()
FILE.close()

tmp_data = sending_data

while (1):
  #UDPSock.listen(1)
  #UDPSock.sendto(msg, addr)
  #FILE = open("gen1000.dat","r+")
  #sending_data = FILE.read()
  #FILE.close()


  #print 'client is at', addr
  data, addr = UDPSock.recvfrom(buf)
  #time.sleep(3)
  print data
  #msg = 'hello'

  # 
  tmp, sending_data = sending_data[:buf-6], sending_data[buf-6:]

  if len(tmp) < 1:
    msg = 'done'
    UDPSock.sendto(msg, addr)
    print "finished"
    sending_data = tmp_data

  UDPSock.sendto(tmp, addr)
  print "sending"
  #time.sleep(3)
UDPSock.close()

【问题讨论】:

标签: python sockets client


【解决方案1】:

服务器必须执行序列socket()bind()listen()accept()(可能重复accept()以服务多个客户端),而客户端只需要序列socket()connect()

我第一次看到你失踪的listen()。监听到套接字的连接。

在此处了解更多信息:link text

【讨论】:

    【解决方案2】:

    看这个:http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf

    这是一个非常好的 Python 网络教程,包括客户端和服务器的工作示例。现在,我不是这方面的专家,但在我看来,您的代码过于复杂。所有被注释掉的行是怎么回事?

    引自问题:

    #UDPSock.listen(1)
    #UDPSock.sendto(msg, addr)
    #FILE = open("gen1000.dat","r+")
    #sending_data = FILE.read()
    #FILE.close()
    

    结束引用

    这些对我来说似乎是一些非常重要的台词。

    另外,请确保计算机已连接。从提示运行:

    ping [IP]
    

    [IP] 是另一台机器的 IP 地址(注意:如果您没有连接到同一个 LAN,这会变得更加困难,因为您可能然后需要端口转发和 可能静态IP)。

    【讨论】:

    • 此答案中引用的文档不再可用。除此之外,其余的答案似乎更像是评论而不是答案。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2015-02-24
    相关资源
    最近更新 更多