COCOMO II Model:
1.Source Lines of Code(SLOC)
a.SLOC 是logical line ( If-else-endif) 視為一個 SLOC
b.Comment 不計算在SLOC
c.宣告算在SLOC
2.Cost Drivers:
a.Effort = 2.94 * EAF * (KSLOC)E
Where EAF=Effort Adjustment Factor derived from the Cost Drivers
E=an exponent derived from the five Scale Drivers
例如,EAF=1.00, E= 1.0997,8,000 source lines of code
Effort = 2.94 * (1.0) * (8)1.0997 = 28.9 Person-Months
3.Effor Adjustment Factor:
a.Complexity (effort multiplier of 1.34)
b.Language & Tools Experience (effort multiplier of 1.09)
c.the others normal ,set 1.00
Effort Adjustment Factor = EAF = 1.34 * 1.09 = 1.46
Effort = 2.94 * (1.46) * (8)1.0997 = 42.3 Person-Months
4.Schedule Equation:
a.Duration = 3.67 * (Effort)SE
Where
Effort Is the effort from the COCOMO II effort equation
SE Is the schedule equation exponent derived from the five Scale Drivers
b. 0.3179 that is calculated from the scale drivers:
Duration = 3.67 * (42.3)0.3179 = 12.1 months
Average staffing = (42.3 Person-Months) / (12.1 Months) = 3.5 people
5.SCED Cost Drivers:
a.Required Development Schedule(SCED)
b.代表若要加速工作進度,在樂觀的條件下,需要多少人力
c.SCED rating of Very Low corresponds to an Effort Multiplier of 1.43 (in the COCOMO II.2000 model)
d.means that you intend to finish your project in 75% of the optimum schedule .
Duration = 75% * 12.1 Months = 9.1 Months
Effort Adjustment Factor = EAF = 1.34 * 1.09 * 1.43 = 2.09
Effort = 2.94 * (2.09) * (8)1.0997 = 60.4 Person-Months
Average staffing = (60.4 Person-Months) / (9.1 Months) = 6.7 people
Remember: SCED cost driver means "accelerated from the nominal schedule".
2009年12月11日 星期五
2009年12月8日 星期二
MS SQL Role and User security
SQL server 兩種登入方式(二選一) :
1. Window 網域帳號登入,歸Window 作業系統
2. SQL server 帳號登入,SQL server 管理(Server roles are usually reserved for database and server administrators.)
Role types:
1.Server Role -DBA 維護,管理整台server
2.Database Role - 管理單一的database
3.public role 只要一加入 SQL server,都有public role
Database Role(Predefine):
Server Role(Predefine ):
1. Window 網域帳號登入,歸Window 作業系統
2. SQL server 帳號登入,SQL server 管理(Server roles are usually reserved for database and server administrators.)
3. Windows Authentication is the recommended security model when using SQL Server.
安全分等:
安全分等:
- Login security—Connecting to the server (登入 Server)
- Database security—Getting access to the database (存取DB)
- Database objects—Getting access to individual database objects and data(存取DB的某一個object/data)
Role types:
1.Server Role -DBA 維護,管理整台server
2.Database Role - 管理單一的database
3.public role 只要一加入 SQL server,都有public role
Database Role(Predefine):
- db_owner: Members have full access.
- db_accessadmin: Members can manage Windows groups and SQL Server logins.
- db_datareader: Members can read all data.
- db_datawriter: Members can add, delete, or modify data in the tables.
- db_ddladmin: Members can run dynamic-link library (DLL) statements.
- db_securityadmin: Members can modify role membership and manage permissions.
- db_bckupoperator: Members can back up the database.
- db_denydatareader: Members can’t view data within the database.
- db_denydatawriter: Members can’t change or delete data in tables or views.
Server Role(Predefine ):
- SysAdmin: Any member can perform any action on the server.
- ServerAdmin: Any member can set configuration options on the server.
- SetupAdmin: Any member can manage linked servers and SQL Server startup options and tasks.
- Security Admin: Any member can manage server security.
- ProcessAdmin: Any member can kill processes running on SQL Server.
- DbCreator: Any member can create, alter, drop, and restore databases.
- DiskAdmin: Any member can manage SQL Server disk files.
- BulkAdmin: Any member can run the bulk insert command.
2009年11月18日 星期三
TCP Windows Size 解答
說明TCP Windows Size 的用途與注意事項
1.TCP Windows Size 目的是 Sender 與 Receiver 最好能把Data 一次處理完,
以避免因為網路設備彼此速度不同,而造成Data Lost 的問題。
2. TCP Windows Size 要多大呢?
window size = bandwidth * delay
假設網路是 100 Mbits/s, round trip time (RTT)是 5 ms,所以 Windows Size 應為
( 100 * 10^6) *( 5 * 10^-3) = 500 * 10^3 bits (65 kilobytes)
3.最後 Client 與 Server 的buffer 要設一樣:
/* An example of client code that sets the TCP window size */
int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);
a.Nonstop 系統
TCP programming :setsockopt 參數(SO_SNDBUF/SO_RCVBUF)
Default 8192 bytes
5.參考:
a.A User's Guide to TCP Windows
b.Enabling High Performance Data Transfers
c.Windows 2000 TCP Performance Tuning Tips
6.
a.Max Transmission Unit (MTU) - TCP header(20 byte)- IP header (20 bytes) =Max Segment Size(MSS)
b.
1.TCP Windows Size 目的是 Sender 與 Receiver 最好能把Data 一次處理完,
以避免因為網路設備彼此速度不同,而造成Data Lost 的問題。
2. TCP Windows Size 要多大呢?
window size = bandwidth * delay
假設網路是 100 Mbits/s, round trip time (RTT)是 5 ms,所以 Windows Size 應為
( 100 * 10^6) *( 5 * 10^-3) = 500 * 10^3 bits (65 kilobytes)
3.最後 Client 與 Server 的buffer 要設一樣:
/* An example of client code that sets the TCP window size */
int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);
/* These setsockopt()s must happen before the connect() */4.備註:
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));
connect(sock, (struct sockaddr *) &address, sizeof(address));
/* An example of server code that sets the TCP window size */
int window_size = 128 * 1024; /* 128 kilobytes */
sock = socket(AF_INET, SOCK_STREAM, 0);
/* These setsockopt()s must happen before the accept() */
setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(char *) &window_size, sizeof(window_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(char *) &window_size, sizeof(window_size));
listen(sock, 5);
accept(sock, NULL, NULL);
a.Nonstop 系統
TCP programming :setsockopt 參數(SO_SNDBUF/SO_RCVBUF)
Default 8192 bytes
5.參考:
a.A User's Guide to TCP Windows
b.Enabling High Performance Data Transfers
c.Windows 2000 TCP Performance Tuning Tips
6.
a.Max Transmission Unit (MTU) - TCP header(20 byte)- IP header (20 bytes) =Max Segment Size(MSS)
b.
2009年11月12日 星期四
Python ctypes 使用方法(2)
介紹一些使用方法:
define C library 的 header 檔
define C library 的 header 檔
from ctypes import *
WS_MAX_USER_LEN=10
WS_MAX_PIN_LEN =4
WS_MAX_LMK_ID =1
WS_MAX_IP_ADDR_LEN =10
WS_MAX_LABEL=5
WS_MAX_DESC=10
WS_MAX_LOG_ENTRY_LEN=100
WS_MAX_ZMK_KEY_ID_LEN=10
WS_VOID=c_void_p
WS_BYTE=c_ubyte
WS_CHAR=WS_BYTE
WS_BOOL=WS_BYTE
WS_USHORT=c_ushort
WS_ULONG=c_ulong
WS_LONG=c_long
WS_RV=WS_ULONG
WS_UNIT_ID=WS_ULONG
WS_DEVICE_ID=WS_ULONG
WS_CLUSTER_ID=WS_ULONG
WS_FLAGS=WS_ULONG
WS_UNIT_TYPE=WS_ULONG
# WebSentry Specific Return Codes #
WSR_OK= 0x00000000
WSR_CANCEL = 0x00000001
WSR_HOST_MEMORY= 0x00000002
WSR_UNIT_ID_INVALID =0x00000003
WSR_GENERAL_ERROR=0x00000005
class WS_ITEM(Structure):
_fields_=[('pData',POINTER(WS_BYTE)),('len', WS_ULONG)]
class WS_VERSION(Structure):
_fields_=[('major', WS_BYTE), ('minor', WS_BYTE)]
from wapich import * #import python wrap data
from ctypes import *
libc=cdll.LoadLibrary('wapicd.dll')
WS_Initialize=libc.WS_Initialize #define function
WS_Initialize.restype=WS_RV # set return type = WS_RV, if none, always return int
rv=WSR_OK
rv=WS_Initialize()
if rv != WSR_OK:
print rv
else:
print 'WS_Initialize is Ok'
WS_GetInfo=libc.WS_GetInfo
WS_GetInfo.restype=WS_RV
myInfo=WS_INFO()
myInfo_p=pointer(myInfo)
myInfo_p.contents=myInfo # assign myInfo_ptr pointer to myInfo
rv=WSR_OK
rv=WS_GetInfo(myInfo_p)
if rv !=WSR_OK:
print rv
print myInfo.manufacturerID[:]
print myInfo.description[:]
print myInfo.version.major
print myInfo.version.minor
2009年11月6日 星期五
Python ctypes 使用方法(1)
因為要使用C libray ,所以要使用ctypes 去 wrap C function
from ctypes import *
from ctypes.util import find_library
print '---Begin Show----'
print find_library('c')
print windll.kernel32
print cdll.msvcrt
print find_library('wapicd')
libc=cdll.LoadLibrary("msvcr90.dll")
print "---------- char --------"
x=c_char_p("Hello World")
print x
print x.value
print sizeof(x)
print '---------- int ----------'
i=c_int(42)
print i
print i.value
p = create_string_buffer("Hello", 10)
print sizeof(p), repr(p.raw)
print "---------- Bo class---------------"
class Bo(object):
def __init__(self, number):
self._as_parameter_=number
bo=Bo(33)
printf = libc.printf
printf("%d bottles of beer \n", bo)
strchr=libc.strchr
print strchr('abcdef', ord('c'))
strchr.restype=c_char_p # set retyrn type is char_pointer
print strchr('abcdef', ord('d'))
print '----Passing by reference---------'
i=c_int()
f=c_float()
s=create_string_buffer('\000'*32)
print i.value, f.value, repr(s.value)
libc.sscanf("1 3.14 hello", "%d %f %s", byref(i), byref(f), s) #Passing by ref
print i.value, f.value, repr(s.value)
print '---- Pointer ---------'
ptr_i=pointer(i)
ptr_f=pointer(f)
ptr_s=pointer(s)
libc.sscanf("1 3.14 hello", "%d %f %s", ptr_i,ptr_f,ptr_s)
print i.value, f.value, repr(s.value)
print 'point of i:', ptr_i.contents
print 'point of f:', ptr_f.contents
print 'point of s:', ptr_s.contents
print '------------ Test Structure ---------'
class POINT(Structure):
_fields_=[('x', c_int), ('y', c_int)]
p=POINT(10, 20)
print p.x, p.y
def testptr(a):
b=POINT()
b=a
b.x=a.x+100
b.y=a.y+100
return b
testptr.restype=POINT()
g=testptr(p)
print g.x, g.y
測試結果:
---Begin Show----
msvcr90.dll
C:\WINDOWS\system32\wapicd.dll
---------- char --------
c_char_p('Hello World')
Hello World
4
---------- int ----------
c_long(42)
42
10 'Hello\x00\x00\x00\x00\x00'
---------- Bo class---------------
12838358
def
----Passing by reference byref()---------
0 0.0 ''
1 3.1400001049 'hello'
---- Pointer pointer()---------
1 3.1400001049 'hello'
point of i: c_long(1)
point of f: c_float(3.1400001049041748)
point of s:
------------ Test Structure ---------
10 20
110 120
2009年10月29日 星期四
Python in Plurk
因為看到Plurk 是可以用網路程式去發送訊息的,所以想說用Python 試試看,說明方法如下:
1.Install SimpleJSON
Ans: easy_install simplejson ,它會自動Download 到你的Python 目錄去
2.Download plurkapi ,Copy plurkapi.py 到 D:\Python26\Lib (這是我的python 目錄)
plurkapi download location
3.因為無法發中文,看來應該是沒宣告Coding ,所以在 plurkapi.py 加入
# *- coding: UTF-8 -*-
4.Sample Code 做法:
1.Install SimpleJSON
Ans: easy_install simplejson ,它會自動Download 到你的Python 目錄去
2.Download plurkapi ,Copy plurkapi.py 到 D:\Python26\Lib (這是我的python 目錄)
plurkapi download location
3.因為無法發中文,看來應該是沒宣告Coding ,所以在 plurkapi.py 加入
# *- coding: UTF-8 -*-
4.Sample Code 做法:
# *- coding: UTF-8 -*-
import plurkapi
import sys
# Create an API object.
# Pass in your own username and password to the "login" method.
#
plurk_api = plurkapi.PlurkAPI()
if plurk_api.login('nickname', 'password') == False:
print "Login failed!"
sys.exit(1)
plurk_api.addPlurk(lang='tr_ch',qualifier='says',content='中文化Say Hello 222222!!!')
2009年5月27日 星期三
NonStop Server 試用Python
目標:使用python 開發Client/Server Thread program
測試結果:Nonstop server 不支援 Thread,只能使用 fork 。
Client 程式:
Server 程式:
測試結果:Nonstop server 不支援 Thread,只能使用 fork 。
Client 程式:
#######################################################
## Demo:Opening a Client-Side Socket for Sending Data
#######################################################
print '#'*60
print '# Demo:Opening a Client-Side Socket for Sending Data'
print '#'*60
import thread
import sys,time,os
from socket import *
def client(id):
serverHost = '192.168.110.93'
serverPort = 12343
def now():
return time.ctime(time.time( ))
message = 'I am ID: %s' %id + '- Time: %s' %(now())
if len(sys.argv) > 1:
serverHost = sys.argv[1]
#Create a socket
sSock = socket(AF_INET, SOCK_STREAM)
try :
#Connect to server
sSock.connect((serverHost, serverPort))
except Exception, e:
sSock.close()
os._exit(0)
#Send messages
sSock.send(message)
data = sSock.recv(1024)
print 'Client received: ', data
sSock.close()
os._exit(0)
def main():
i=0
while True:
newpid = os.fork()
if newpid == 0:client(i)
i=i+1
if i > 10 :break
if __name__ =='__main__':
main()
Server 程式:
import SocketServer,time
myHost=''
myPort=12343
class MyClientHandler(SocketServer.BaseRequestHandler):
def handle(self):
print 'Welcome Clinet:',self.client_address
while True:
data=self.request.recv(1024)
time.sleep(1)
if not data:break
print 'Send Back:',data
self.request.send(data)
self.request.close()
myaddr=(myHost,myPort)
server=SocketServer.ThreadingTCPServer(myaddr,MyClientHandler)
server.serve_forever()
2009年5月20日 星期三
Python 複利計算
都是同事問我複利計算,微積分早就還給老師了,不知公式如何,只好自個想啦!
Amt-定期定額
Rate-利率
Y1=Amt*(1+Rate)
Y2=(Y1+Amt)*(1+Rate)
Yn=(Yn-1+Amt)*(1+Rate)
Python sample 程式如下:
# Directory 解法
-------------------------------------------------
Amt-定期定額
Rate-利率
Y1=Amt*(1+Rate)
Y2=(Y1+Amt)*(1+Rate)
Yn=(Yn-1+Amt)*(1+Rate)
Python sample 程式如下:
# Directory 解法
f={}
base=100
rate =0.05
f[1]=base*(1+rate)
i=1
for i in range(2,5):
f[i]=(f[i-1]+base)*(1+rate)
for key in f:
print key,f[key]
#Generator 解法def f(first,n):
while True:
result= (first+100)*(1.05)
first=result
n=n+1
print n,first
yield first
base=100
rate =0.05
i=1
gh=f(0,0)
for i in range(1,5):
gh.next()
-------------------------------------------------
2009年5月6日 星期三
Python Network Programming
1.Basic Socket Usage
Python is using only two communication domains: UNIX(AF_UNIX) and Internet domains(AF_INET)
2.1Create Socket
socket(family, type [, proto ])
family =AF_INET,AF_UNIX
type=SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET,SOCK_RDM
TCP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) UDP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2.2Connecting a socket and data transfer
Internet domain: sock.connect(('localhost', 8000))
UNIX domain:sock.connect('/tmp/sock')
2.3 Binding a name to socket
Internet domain:sock.bind(('localhost', 8000))
UNIX domain:sock.bind('/tmp/sock')
2.4 Listening and accepting connections
sock.listen(5)
clisock, address = sock.accept()
TCP servers 固定流程:bind-listen-accept
TCP socket is connection-oriented; when a client wants to speak to a particular server it must
connect itself, wait until the server accepts the connection, exchange data then close.
2.5 UDP sockets(保留待釐清)
Data packets are send and received with the sendto(data, address ) and recvfrom(buffer[, flags ]) methods
2.6 Closing the Socket
socket.close()
記得:一定要Close a socket 才能再使用它
2.7 Socket Module 常用的function
socket.getfqdn('www.yahoo.com.tw) -return the \Fully Qualied Domain Name"
>>'w2.rd.vip.tw1.yahoo.com'
>>> socket.getfqdn()
'UT09002311.uitctech.com.tw'
gethostbyname(hostname )- Get IP address
>>> socket.gethostbyname('www.yahoo.com.tw')
'119.160.246.23'
>>> socket.gethostbyname_ex('www.yahoo.com.tw')
('tw1-w2.rd.tw.g1.b.yahoo.com', ['www.yahoo.com.tw', 'rc.tpe.yahoo.com', 'tw.rc.yahoo.com', 'w2.rd.tw.g1.b.yahoo.com'], ['119.160.246.23'])
gethostbyaddr(ipaddr )-Get Host name
>>> socket.gethostbyaddr('127.0.0.1')
('localhost', [], ['127.0.0.1'])
>>> socket.gethostbyaddr('119.160.246.23')
('w2.rd.vip.tw1.yahoo.com', [], ['119.160.246.23'])
getservbyname(servname )-轉換 service 變成port
>>> socket.getservbyname('ftp')
21
getprotobyname('ICMP')- 轉換protocol 變成corresponding number
>>> socket.getprotobyname('ICMP')
1
其它:
Function Name Synopsis
htons(sint ) Convert short integer from host to network format
ntohs(sint ) Convert short integer from network to host format
htonl(lint ) Convert long integer from host to network format
ntohl(lint ) Convert long integer from network to host
3.基本網路Flow 設計
TCP Model:(只能處理單一Client)
![]()
![]()
![]()
Echo server sample code:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8000))
serversocket.listen(1)
clientsocket, clientaddress = serversocket.accept()
print 'Connection from ', clientaddress
while 1:
data = clientsocket.recv(1024)
if not data: break
clientsocket.send(data)
clientsocket.close()
Echo client sample code:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8000))
while 1:
data = raw_input('>')
clientsocket.send(data)
if not data: break
newdata = clientsocket.recv(1024)
print newdata
clientsocket.close()
UDP Echo server sample code:
# -*- Coding:Utf-8 -*-
# UDP model
from socket import *
ssock=socket(AF_INET,SOCK_DGRAM)
ssock.bind(('localhost',9999))
while 1:
data,addr =ssock.recvfrom(1024)
if not data:break
ssock.sendto(data,addr)
ssock.close()
UDP Echo client sample code:
from socket import *
ssock = socket(AF_INET,SOCK_DGRAM)
while 1:
data = raw_input('>')
ssock.sendto(data, ('localhost', 9999))
if not data: break;
newdata = ssock.recvfrom(1024)
print newdata
ssock.close()
4.處理多個Client 的Server 方式:
Thread-server.py
############################################################################# # Server side: open a socket on a port, listen for a message from a client, # and send an echo reply; echoes lines until eof when client closes socket; # spawns a thread to handle each client connection; threads share global # memory space with main thread; this is more portable than fork: threads # work on standard Windows systems, but process forks do not; ############################################################################# import thread, time from socket import * # get socket constructor and constants myHost = '127.0.0.1' # server machine, '' means local host myPort = 50007 # listen on a non-reserved port number sockobj = socket(AF_INET, SOCK_STREAM) # make a TCP socket object sockobj.bind((myHost, myPort)) # bind it to server port number sockobj.listen(5) # allow up to 5 pending connects def now( ): return time.ctime(time.time( )) # current time on the server def handleClient(connection): # in spawned thread: reply time.sleep(5) # simulate a blocking activity while True: # read, write a client socket data = connection.recv(1024) if not data: break connection.send('Echo=>%s at %s' % (data, now( ))) connection.close( ) def dispatcher( ): # listen until process killed while True: # wait for next connection, connection, address = sockobj.accept( ) # pass to thread for service print 'Server connected by', address, print 'at', now( ) thread.start_new(handleClient, (connection,)) dispatcher( )
Class-socket.py
#############################################################################
# Server side: open a socket on a port, listen for a message from a client,
# and send an echo reply; this version uses the standard library module
# SocketServer to do its work; SocketServer allows us to make a simple
# TCPServer, a ThreadingTCPServer, a ForkingTCPServer, and more, and
# routes each client connect request to a new instance of a passed-in
# request handler object's handle method; SocketServer also supports
# UDP and Unix domain sockets; see the library manual for other usage.
#############################################################################
import SocketServer, time # get socket server, handler objects
myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
def now( ):
return time.ctime(time.time( ))
class MyClientHandler(SocketServer.BaseRequestHandler):
def handle(self): # on each client connect
print self.client_address, now( ) # show this client's address
time.sleep(5) # simulate a blocking activity
while True: # self.request is client socket
data = self.request.recv(1024) # read, write a client socket
if not data: break
self.request.send('Echo=>%s at %s' % (data, now( )))
self.request.close( )
# make a threaded server, listen/handle clients forever
myaddr = (myHost, myPort)
server = SocketServer.ThreadingTCPServer(myaddr, MyClientHandler)
server.serve_forever( )
Select-server.py
#############################################################################
# Server: handle multiple clients in parallel with select. use the select
# module to manually multiplex among a set of sockets: main sockets which
# accept new client connections, and input sockets connected to accepted
# clients; select can take an optional 4th arg--0 to poll, n.m to wait n.m
# seconds, or ommitted to wait till any socket is ready for processing.
#############################################################################
import sys, time
from select import select
from socket import socket, AF_INET, SOCK_STREAM
def now(): return time.ctime(time.time( ))
myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
if len(sys.argv) == 3: # allow host/port as cmdline args too
myHost, myPort = sys.argv[1:]
numPortSocks = 2 # number of ports for client connects
# make main sockets for accepting new client requests
mainsocks, readsocks, writesocks = [], [], []
for i in range(numPortSocks):
portsock = socket(AF_INET, SOCK_STREAM) # make a TCP/IP spocket object
portsock.bind((myHost, myPort)) # bind it to server port number
portsock.listen(5) # listen, allow 5 pending connects
mainsocks.append(portsock) # add to main list to identify
readsocks.append(portsock) # add to select inputs list
myPort += 1 # bind on consecutive ports
# event loop: listen and multiplex until server process killed
print 'select-server loop starting'
while True:
#print readsocks
readables, writeables, exceptions = select(readsocks, writesocks, [])
for sockobj in readables:
if sockobj in mainsocks: # for ready input sockets
# port socket: accept new client
newsock, address = sockobj.accept( ) # accept should not block
print 'Connect:', address, id(newsock) # newsock is a new socket
readsocks.append(newsock) # add to select list, wait
else:
# client socket: read next line
data = sockobj.recv(1024) # recv should not block
print '\tgot:', data, 'on', id(sockobj)
if not data: # if closed by the clients
sockobj.close( ) # close here and remv from
readsocks.remove(sockobj) # del list else reselected
else:
# this may block: should really select for writes too
sockobj.send('Echo=>%s at %s' % (data, now( )))
Python is using only two communication domains: UNIX(AF_UNIX) and Internet domains(AF_INET)
2.1Create Socket
socket(family, type [, proto ])
family =AF_INET,AF_UNIX
type=SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET,SOCK_RDM
TCP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) UDP 連接語法:sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2.2Connecting a socket and data transfer
Internet domain: sock.connect(('localhost', 8000))
UNIX domain:sock.connect('/tmp/sock')
2.3 Binding a name to socket
Internet domain:sock.bind(('localhost', 8000))
UNIX domain:sock.bind('/tmp/sock')
2.4 Listening and accepting connections
sock.listen(5)
clisock, address = sock.accept()
TCP servers 固定流程:bind-listen-accept
TCP socket is connection-oriented; when a client wants to speak to a particular server it must
connect itself, wait until the server accepts the connection, exchange data then close.
2.5 UDP sockets(保留待釐清)
Data packets are send and received with the sendto(data, address ) and recvfrom(buffer[, flags ]) methods
2.6 Closing the Socket
socket.close()
記得:一定要Close a socket 才能再使用它
2.7 Socket Module 常用的function
socket.getfqdn('www.yahoo.com.tw) -return the \Fully Qualied Domain Name"
>>'w2.rd.vip.tw1.yahoo.com'
>>> socket.getfqdn()
'UT09002311.uitctech.com.tw'
gethostbyname(hostname )- Get IP address
>>> socket.gethostbyname('www.yahoo.com.tw')
'119.160.246.23'
>>> socket.gethostbyname_ex('www.yahoo.com.tw')
('tw1-w2.rd.tw.g1.b.yahoo.com', ['www.yahoo.com.tw', 'rc.tpe.yahoo.com', 'tw.rc.yahoo.com', 'w2.rd.tw.g1.b.yahoo.com'], ['119.160.246.23'])
gethostbyaddr(ipaddr )-Get Host name
>>> socket.gethostbyaddr('127.0.0.1')
('localhost', [], ['127.0.0.1'])
>>> socket.gethostbyaddr('119.160.246.23')
('w2.rd.vip.tw1.yahoo.com', [], ['119.160.246.23'])
getservbyname(servname )-轉換 service 變成port
>>> socket.getservbyname('ftp')
21
getprotobyname('ICMP')- 轉換protocol 變成corresponding number
>>> socket.getprotobyname('ICMP')
1
其它:
Function Name Synopsis
htons(sint ) Convert short integer from host to network format
ntohs(sint ) Convert short integer from network to host format
htonl(lint ) Convert long integer from host to network format
ntohl(lint ) Convert long integer from network to host
3.基本網路Flow 設計
TCP Model:(只能處理單一Client)
UDP Model:(只能處理單一Client)
Echo server sample code:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8000))
serversocket.listen(1)
clientsocket, clientaddress = serversocket.accept()
print 'Connection from ', clientaddress
while 1:
data = clientsocket.recv(1024)
if not data: break
clientsocket.send(data)
clientsocket.close()
Echo client sample code:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8000))
while 1:
data = raw_input('>')
clientsocket.send(data)
if not data: break
newdata = clientsocket.recv(1024)
print newdata
clientsocket.close()
UDP Echo server sample code:
# -*- Coding:Utf-8 -*-
# UDP model
from socket import *
ssock=socket(AF_INET,SOCK_DGRAM)
ssock.bind(('localhost',9999))
while 1:
data,addr =ssock.recvfrom(1024)
if not data:break
ssock.sendto(data,addr)
ssock.close()
UDP Echo client sample code:
from socket import *
ssock = socket(AF_INET,SOCK_DGRAM)
while 1:
data = raw_input('>')
ssock.sendto(data, ('localhost', 9999))
if not data: break;
newdata = ssock.recvfrom(1024)
print newdata
ssock.close()
4.處理多個Client 的Server 方式:
Thread-server.py
############################################################################# # Server side: open a socket on a port, listen for a message from a client, # and send an echo reply; echoes lines until eof when client closes socket; # spawns a thread to handle each client connection; threads share global # memory space with main thread; this is more portable than fork: threads # work on standard Windows systems, but process forks do not; ############################################################################# import thread, time from socket import * # get socket constructor and constants myHost = '127.0.0.1' # server machine, '' means local host myPort = 50007 # listen on a non-reserved port number sockobj = socket(AF_INET, SOCK_STREAM) # make a TCP socket object sockobj.bind((myHost, myPort)) # bind it to server port number sockobj.listen(5) # allow up to 5 pending connects def now( ): return time.ctime(time.time( )) # current time on the server def handleClient(connection): # in spawned thread: reply time.sleep(5) # simulate a blocking activity while True: # read, write a client socket data = connection.recv(1024) if not data: break connection.send('Echo=>%s at %s' % (data, now( ))) connection.close( ) def dispatcher( ): # listen until process killed while True: # wait for next connection, connection, address = sockobj.accept( ) # pass to thread for service print 'Server connected by', address, print 'at', now( ) thread.start_new(handleClient, (connection,)) dispatcher( )
Class-socket.py
#############################################################################
# Server side: open a socket on a port, listen for a message from a client,
# and send an echo reply; this version uses the standard library module
# SocketServer to do its work; SocketServer allows us to make a simple
# TCPServer, a ThreadingTCPServer, a ForkingTCPServer, and more, and
# routes each client connect request to a new instance of a passed-in
# request handler object's handle method; SocketServer also supports
# UDP and Unix domain sockets; see the library manual for other usage.
#############################################################################
import SocketServer, time # get socket server, handler objects
myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
def now( ):
return time.ctime(time.time( ))
class MyClientHandler(SocketServer.BaseRequestHandler):
def handle(self): # on each client connect
print self.client_address, now( ) # show this client's address
time.sleep(5) # simulate a blocking activity
while True: # self.request is client socket
data = self.request.recv(1024) # read, write a client socket
if not data: break
self.request.send('Echo=>%s at %s' % (data, now( )))
self.request.close( )
# make a threaded server, listen/handle clients forever
myaddr = (myHost, myPort)
server = SocketServer.ThreadingTCPServer(myaddr, MyClientHandler)
server.serve_forever( )
Select-server.py
#############################################################################
# Server: handle multiple clients in parallel with select. use the select
# module to manually multiplex among a set of sockets: main sockets which
# accept new client connections, and input sockets connected to accepted
# clients; select can take an optional 4th arg--0 to poll, n.m to wait n.m
# seconds, or ommitted to wait till any socket is ready for processing.
#############################################################################
import sys, time
from select import select
from socket import socket, AF_INET, SOCK_STREAM
def now(): return time.ctime(time.time( ))
myHost = '' # server machine, '' means local host
myPort = 50007 # listen on a non-reserved port number
if len(sys.argv) == 3: # allow host/port as cmdline args too
myHost, myPort = sys.argv[1:]
numPortSocks = 2 # number of ports for client connects
# make main sockets for accepting new client requests
mainsocks, readsocks, writesocks = [], [], []
for i in range(numPortSocks):
portsock = socket(AF_INET, SOCK_STREAM) # make a TCP/IP spocket object
portsock.bind((myHost, myPort)) # bind it to server port number
portsock.listen(5) # listen, allow 5 pending connects
mainsocks.append(portsock) # add to main list to identify
readsocks.append(portsock) # add to select inputs list
myPort += 1 # bind on consecutive ports
# event loop: listen and multiplex until server process killed
print 'select-server loop starting'
while True:
#print readsocks
readables, writeables, exceptions = select(readsocks, writesocks, [])
for sockobj in readables:
if sockobj in mainsocks: # for ready input sockets
# port socket: accept new client
newsock, address = sockobj.accept( ) # accept should not block
print 'Connect:', address, id(newsock) # newsock is a new socket
readsocks.append(newsock) # add to select list, wait
else:
# client socket: read next line
data = sockobj.recv(1024) # recv should not block
print '\tgot:', data, 'on', id(sockobj)
if not data: # if closed by the clients
sockobj.close( ) # close here and remv from
readsocks.remove(sockobj) # del list else reselected
else:
# this may block: should really select for writes too
sockobj.send('Echo=>%s at %s' % (data, now( )))
2009年4月26日 星期日
Google App Engine (1)
for Beginner who using Google App Engine and memo for myself.
Resource :
1.Google App Engine(GAE)
2.Docs
1.Download and install at C:\Google\google_appengine
Two pyhton programs thats your need to know first.
a.dev_appserver.py, the development web server(在自己電腦用的Web server)
b.appcfg.py, for uploading your app to App Engine(Upload 到你的App Host)
2.Create your folder(project) like C:\helloworld
3. Create helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, world! Ray '
4.Create app.yaml
application: yehrayyeh
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.py
5.在自己電腦測試
c:\helloworld>dev_appserver.py c:/helloworld
測試 URL http://localhost:8080/
6.放到 GAE 去看看, Google http://appengine.google.com/
方法如下:appcfg.py update c:/helloworld
Resource :
1.Google App Engine(GAE)
2.Docs
1.Download and install at C:\Google\google_appengine
Two pyhton programs thats your need to know first.
a.dev_appserver.py, the development web server(在自己電腦用的Web server)
b.appcfg.py, for uploading your app to App Engine(Upload 到你的App Host)
2.Create your folder(project) like C:\helloworld
3. Create helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, world! Ray '
4.Create app.yaml
application: yehrayyeh
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.py
5.在自己電腦測試
c:\helloworld>dev_appserver.py c:/helloworld
測試 URL http://localhost:8080/
6.放到 GAE 去看看, Google http://appengine.google.com/
方法如下:appcfg.py update c:/helloworld
訂閱:
文章 (Atom)