Python: как работать с несколькими клиентами и сервером - PullRequest
1 голос
/ 10 января 2011

Я реализую программу с сервером и несколькими клиентами. Все клиенты отправляют данные на сервер, а сервер проверяет шаг каждого клиента. Если все шаги клиента совпадают, сервер отправляет новые данные всем клиентам для выполнения следующего шага. И он продолжает эту процедуру снова и снова.

Однако, когда я запускаю свою программу, она не может общаться друг с другом. Вот мой код. Не могли бы вы дать мне несколько советов?

клиент и сервер

#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 голос
/ 10 января 2011

Посмотрите на это: 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 голос
/ 10 января 2011

Сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания более одного клиента), в то время как клиенту нужна только последовательность socket(),connect().

Ваш пропавший listen() Я видел первым.Прослушайте подключения к сокету.

Подробнее об этом здесь: текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...