Python:如何处理多个客户端和一个服务器

1 投票
2 回答
6592 浏览
提问于 2025-04-16 09:43

我正在实现一个有服务器和多个客户端的程序。所有客户端都会向服务器发送数据,服务器会检查每个客户端的步骤。如果所有客户端的步骤都一样,服务器就会向所有客户端发送新的数据,让它们进行下一步。这个过程会不断重复。

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

客户端和服务器

#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()

2 个回答

1

看看这个链接: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地址(注意:如果你们不在同一个局域网,这就会变得很麻烦,因为你可能需要进行端口转发,并且可能需要静态IP)。

1

一个服务器需要按照这个顺序来操作:先创建一个“插座”(也就是socket),然后把这个插座绑定到一个地址上,再开始监听连接,最后接受连接(可能需要多次接受,以服务多个客户端)。而客户端只需要做这几步:创建一个“插座”,然后连接到服务器。

你缺少的就是那个“监听”(listen())的步骤。我最先看到的就是这个。这个步骤是用来监听连接请求的。

想了解更多,可以查看这里:链接文本

撰写回答