Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2014-04-04 13:15:14, 1.6 KB) [[attachment:2014-03-28-ubclient.py]]
- [получить | показать] (2014-04-04 13:15:30, 3.1 KB) [[attachment:2014-03-28-udp.py]]
- [получить | показать] (2014-04-04 13:14:39, 6.6 KB) [[attachment:2014-03-28-udpbowling.py]]
- [получить | показать] (2014-03-28 09:43:10, 0.3 KB) [[attachment:pybroad.py]]
- [получить | показать] (2014-03-28 09:43:02, 0.6 KB) [[attachment:pyudp.py]]
Вам нельзя прикреплять файлы к этой странице.