Initial revision

This commit is contained in:
Guido van Rossum 1992-08-10 10:48:14 +00:00
parent 814d7cd492
commit 260cc1a857
4 changed files with 198 additions and 0 deletions

9
Demo/sockets/ChangeLog Executable file
View File

@ -0,0 +1,9 @@
Mon Aug 10 12:45:43 1992 Guido van Rossum (guido@voorn.cwi.nl)
* README: added broadcast.py, ftp.py, radio.py
-------------------------------------------------------------------------------
^^^ Log entries after release of 0.9.6 ^^^
-------------------------------------------------------------------------------

5
Demo/threads/README Normal file
View File

@ -0,0 +1,5 @@
This directory contains some demonstrations of the thread module.
They are mostly "proof of concept" type applications:
telnet.py Version of ../sockets/telnet.py using threads.
wpi.py Version of ../scripts/pi.py using threads and stdwin.

110
Demo/threads/telnet.py Normal file
View File

@ -0,0 +1,110 @@
# Minimal interface to the Internet telnet protocol.
#
# *** modified to use threads ***
#
# It refuses all telnet options and does not recognize any of the other
# telnet commands, but can still be used to connect in line-by-line mode.
# It's also useful to play with a number of other services,
# like time, finger, smtp and even ftp.
#
# Usage: telnet host [port]
#
# The port may be a service name or a decimal port number;
# it defaults to 'telnet'.
import sys, os, time
from socket import *
import thread
BUFSIZE = 8*1024
# Telnet protocol characters
IAC = chr(255) # Interpret as command
DONT = chr(254)
DO = chr(253)
WONT = chr(252)
WILL = chr(251)
def main():
host = sys.argv[1]
try:
hostaddr = gethostbyname(host)
except error:
sys.stderr.write(sys.argv[1] + ': bad host name\n')
sys.exit(2)
#
if len(sys.argv) > 2:
servname = sys.argv[2]
else:
servname = 'telnet'
#
if '0' <= servname[:1] <= '9':
port = eval(servname)
else:
try:
port = getservbyname(servname, 'tcp')
except error:
sys.stderr.write(servname + ': bad tcp service name\n')
sys.exit(2)
#
s = socket(AF_INET, SOCK_STREAM)
#
try:
s.connect(host, port)
except error, msg:
sys.stderr.write('connect failed: ' + `msg` + '\n')
sys.exit(1)
#
thread.start_new(child, (s,))
parent(s)
def parent(s):
# read socket, write stdout
iac = 0 # Interpret next char as command
opt = '' # Interpret next char as option
while 1:
data, dummy = s.recvfrom(BUFSIZE)
if not data:
# EOF -- exit
sys.stderr.write( '(Closed by remote host)\n')
thread.exit_prog(1)
cleandata = ''
for c in data:
if opt:
print ord(c)
print '(replying: ' + `opt+c` + ')'
s.send(opt + c)
opt = ''
elif iac:
iac = 0
if c == IAC:
cleandata = cleandata + c
elif c in (DO, DONT):
if c == DO: print '(DO)',
else: print '(DONT)',
opt = IAC + WONT
elif c in (WILL, WONT):
if c == WILL: print '(WILL)',
else: print '(WONT)',
opt = IAC + DONT
else:
print '(command)', ord(c)
elif c == IAC:
iac = 1
print '(IAC)',
else:
cleandata = cleandata + c
sys.stdout.write(cleandata)
sys.stdout.flush()
## print 'Out:', `cleandata`
def child(s):
# read stdin, write socket
while 1:
line = sys.stdin.readline()
## print 'Got:', `line`
s.send(line)
main()

74
Demo/threads/wpi.py Normal file
View File

@ -0,0 +1,74 @@
# Display digits of pi in a window, calculating in a separate thread.
# Compare ../scripts/pi.py.
import time
import thread
import stdwin
from stdwinevents import *
digits = []
def worker():
k, a, b, a1, b1 = 2l, 4l, 1l, 12l, 4l
while 1:
# Next approximation
p, q, k = k*k, 2l*k+1l, k+1l
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
# Print common digits
d, d1 = a/b, a1/b1
#print a, b, a1, b1
while d == d1:
digits.append(`int(d)`)
a, a1 = 10l*(a%b), 10l*(a1%b1)
d, d1 = a/b, a1/b1
def main():
digits_seen = 0
thread.start_new_thread(worker, ())
tw = stdwin.textwidth('0 ')
lh = stdwin.lineheight()
stdwin.setdefwinsize(20 * tw, 20 * lh)
win = stdwin.open('digits of pi')
options = win.menucreate('Options')
options.additem('Auto scroll')
autoscroll = 1
options.check(0, autoscroll)
while 1:
win.settimer(1)
type, w, detail = stdwin.getevent()
if type == WE_CLOSE:
thread.exit_prog(0)
elif type == WE_DRAW:
(left, top), (right, bottom) = detail
digits_seen = len(digits)
d = win.begindrawing()
for i in range(digits_seen):
h = (i % 20) * tw
v = (i / 20) * lh
if top-lh < v < bottom:
d.text((h, v), digits[i])
d.close()
elif type == WE_TIMER:
n = len(digits)
if n > digits_seen:
win.settitle(`n` + ' digits of pi')
d = win.begindrawing()
for i in range(digits_seen, n):
h = (i % 20) * tw
v = (i / 20) * lh
d.text((h, v), digits[i])
d.close()
digits_seen = n
height = (v + 20*lh) / (20*lh) * (20*lh)
win.setdocsize(0, height)
if autoscroll:
win.show((0, v), (h+tw, v+lh))
elif type == WE_MENU:
menu, item = detail
if menu == options:
if item == 0:
autoscroll = (not autoscroll)
options.check(0, autoscroll)
main()