ネットワーク
更新pingを送信する
PythonSample/UpdatePing
ソケット.TCPクライアント
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
try:
r = sock.connect(('127.0.0.1', 12345))
sock.send('test message')
except socket.error, e:
print 'Error: %s' % e
ソケット.TCPサーバ
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 12345))
sock.listen(1)
try:
while True:
(conn, sa) = sock.accept()
msg = conn.recv(8192)
print msg
conn.close()
except socket.error, e:
print 'Error: %s' % e
ソケット.TCPサーバ
import SocketServer
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
while True:
line = self.rfile.readline()
if len(line) == 0:
return
self.wfile.write(line)
server = SocketServer.TCPServer(('127.0.0.1', 12345), Handler)
print 'listening:', server.socket.getsockname()
server.serve_forever()
- pythonの標準のものを使うともっとスマート。スレッド動作させるクラスもあるよ。
UDPクライアント
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto('test message', ('localhost', 12345))
except socket.error, e:
print 'Error: %s' % e
~
RPCサーバ
import SimpleXMLRPCServer
class Test:
def inc1(self, value):
return value + 1
def inc2(self, value):
return value + 2
def inc3(self, value):
return value + 3
if __name__ == '__main__':
server = SimpleXMLRPCServer.SimpleXMLRPCServer(('127.0.0.1', 12346))
server.register_instance(Test())
server.serve_forever()
- 関数呼び出しのイメージで処理が進められるので便利。
- 特別なプロトコル自分で作る必要がない。
- 練習問題: このサーバを起動して、一度だけRPCクライアントとの通信後サーバを^Cで終了させてその直後にサーバをまた起動するとソケットがまだバインドされているというエラーがでてすぐに起動できない。さてどう改造したらうまく行くのでしょうか?
RPCクライアント
import xmlrpclib
server = xmlrpclib.ServerProxy('http://127.0.0.1:12346')
print server.inc1(1)
print server.inc2(1)
print server.inc3(1)
CGI
import CGIHTTPServer
import BaseHTTPServer
import SimpleHTTPServer
def serveForever(addr, HandlerClass = CGIHTTPServer.CGIHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
HandlerClass.protocol_version = 'HTTP/1.0'
httpd = ServerClass(addr, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on %s:%d" % (sa[0], sa[1])
httpd.serve_forever()
if __name__ == '__main__':
serveForever(('127.0.0.1', 8000))
FTPクライアント
import ftplib
ftp = ftplib.FTP('yourhost')
ftp.login('user', 'xxxxx')
f = open('xxxx.exe', 'wb')
ftp.retrbinary('RETR xxxx.exe', f.write)
f.close()
HTTPクライアント
import httplib
h = httplib.HTTPConnection('www.yahoo.com')
h.request('GET', '/index.html')
r = h.getresponse()
if r.status == httplib.OK:
data = r.read()
print data
print 'Status=', r.status
HTTPサーバ
import BaseHTTPServer
import SimpleHTTPServer
addr = ('127.0.0.1', 8000)
Server = BaseHTTPServer.HTTPServer
handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = Server(addr, handler)
httpd.serve_forever()
メールクライアント
import smtplib
server = smtplib.SMTP('localhost')
fromaddr = 'xxx@xxx.xxx.xxx'
toaddr = 'yyy@yyy.yyy.yyy'
msg = 'test message'
server.sendmail(fromaddr, toaddr, msg)
server.quit()