wiki:Python/Snippet/ネットワーク

ネットワーク

更新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()