mirror of https://github.com/python/cpython
Initial revision
This commit is contained in:
parent
814d7cd492
commit
260cc1a857
|
@ -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 ^^^
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -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.
|
|
@ -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()
|
|
@ -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()
|
Loading…
Reference in New Issue