1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#!/usr/bin/env python
'''
Simple NORM file receiver example app using Python NORM API
Shows off streaming with a super simple chat app.
'''
import sys
import os.path
import curses
import curses.textpad
from threading import Thread
from optparse import OptionParser
from random import randint
import pynorm
from pynorm.extra.manager import Manager, StopManager
USAGE = 'usage: %s [options] name' % sys.argv[0]
DEFAULT_ADDR = '224.1.2.3'
DEFAULT_PORT = 6003
def get_option_parser():
parser = OptionParser(usage=USAGE)
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
parser.add_option('-a', '--address',
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
parser.add_option('-p', '--port', type=int,
help='The port number to listen on (default %i)' % DEFAULT_PORT)
parser.add_option('-i', '--iface',
help='The inteface to transmit multicast on.')
return parser
def main(argv):
(opts, args) = get_option_parser().parse_args(argv)
if len(args) != 2:
print get_option_parser().get_usage()
return 1
instance = pynorm.Instance()
session = instance.createSession(opts.address, opts.port)
if opts.iface:
session.setMulticastInterface(opts.iface)
session.startReceiver(1024*1024)
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
stream = session.streamOpen(1024*1024)
gui = Gui(stream, args[1])
manager = Manager(instance)
manager.register(pynorm.NORM_RX_OBJECT_UPDATED,
lambda e: gui.showText(e.object.streamRead(1024)[1]))
# manager.register(pynorm.NORM_RX_OBJECT_INFO,
# lambda e: gui.showText('%s joined the chat' % e.object.info))
manager.start()
try:
curses.wrapper(gui)
except KeyboardInterrupt:
pass
print 'Exiting...'
stream.streamClose(True)
instance.stop()
manager.join()
return 0
class Gui(object):
def __init__(self, stream, name):
self.stream = stream
self.name = name
self.curline = 0
def __call__(self, stdscr):
self.stdscr = stdscr
maxy, maxx = stdscr.getmaxyx()
self.chatwin = curses.newwin(maxy - 2, maxx, 0, 0)
self.chatwin.scrollok(True)
typewin = curses.newwin(1, maxx, maxy-1, 0)
textbox = curses.textpad.Textbox(typewin)
while True:
self.send(textbox.edit())
typewin.erase()
def send(self, text):
msg = '%s: %s' % (self.name, text)
self.stream.streamWrite(msg)
self.stream.streamFlush(True)
self.showText(msg)
def showText(self, msg):
maxy, maxx = self.stdscr.getmaxyx()
if self.curline >= maxy:
self.curline = maxy - 1
self.chatwin.addstr(self.curline, 0, msg)
self.curline += 1
self.chatwin.refresh()
if __name__ == '__main__':
sys.exit(main(sys.argv))
|