Прикреплённый файл «2014-03-28-udp.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 обрать клиент и сервер в единую программу, которая одновременно и слушает, и посылает сообщения.
   5 «Карта сети». Модифицировать UDP-сервер таким образом, чтобы он рисовал с помощью PyGame все «засветившиеся» компьютеры
   6 
   7     так как в домашних условиях, возможно, доступен только один IP, ввести в протокол понятие "идентификатор" (например, первое слово в датаграмме) и модифицировать клиент и сервер так, чтобы клиент мог задать идентификатор, а сервер их различал
   8     украсить как-нибудь
   9 '''
  10 
  11 import socket, select, sys, pygame, random
  12 
  13 name = len(sys.argv)>1 and sys.argv[1] or "server"
  14 port = len(sys.argv)>2 and int(sys.argv[2]) or 2014
  15 size = 800, 600
  16 W,H = 200,50
  17 pygame.init()
  18 screen = pygame.display.set_mode(size)
  19 font=pygame.font.Font(None, 24)
  20 
  21 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  22 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR|socket.SO_BROADCAST, 1)
  23 check = select.poll()
  24 try:
  25     sock.bind(('', port))
  26 except:
  27     print "Warning: another server found"
  28     if name.startswith("server"):
  29         sys.exit(1)
  30 else:
  31     check.register(sock,select.POLLIN|select.POLLPRI)
  32 pygame.time.set_timer(pygame.USEREVENT, 500)
  33 again, catch = True, None
  34 peers = {}
  35 while again:
  36     event = pygame.event.wait()
  37     if event.type == pygame.QUIT:
  38         again = False
  39     poll = check.poll(0)
  40     if poll:
  41         data, addr = sock.recvfrom(1024)
  42         if data:
  43             data = data.strip().split()
  44             if data[0] not in peers:
  45                 X,Y = random.randrange(size[0]-W), random.randrange(size[1]-H)
  46                 color = [random.randrange(128,255),random.randrange(100,255),random.randrange(0,128)]
  47                 random.shuffle(color)
  48                 msg = font.render(data[0]+" "+addr[0], True, pygame.Color("tan"), (0,0,0))
  49                 peers[data[0]] = [pygame.Rect(X,Y,W,H),pygame.Color(*color), msg, 5]
  50             else:
  51                 peers[data[0]][3]=5
  52     if event.type == pygame.USEREVENT:
  53         sock.sendto(name,('<broadcast>',port))
  54         for name in peers.keys():
  55             if peers[name][3]>0: peers[name][3]-=1
  56             else: del peers[name]
  57     elif event.type == pygame.MOUSEBUTTONDOWN:
  58         for peer in peers:
  59             if peers[peer][0].collidepoint(event.pos):
  60                 catch = peer
  61     elif event.type == pygame.MOUSEBUTTONUP:
  62         catch = None
  63     elif event.type == pygame.MOUSEMOTION:
  64         if catch and event.buttons[0]:
  65             peers[catch][0].center = event.pos
  66     screen.fill((0,0,0))
  67     for name in peers:
  68         rect, color, msg, count = peers[name]
  69         screen.fill(color, rect)
  70         r = msg.get_rect()
  71         r.center = rect.center
  72         screen.blit(msg, r)
  73 
  74     pygame.display.flip()
  75 sock.close()

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.