Changes between Version 1 and Version 2 of Python/Snippet/ネットワーク


Ignore:
Timestamp:
09/20/06 01:13:51 (13 years ago)
Author:
nakiki
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Python/Snippet/ネットワーク

    v1 v2  
     1 
     2== ソケット.TCPクライアント == 
     3{{{ 
     4#!python 
     5import socket 
     6 
     7sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     8sock.settimeout(10) 
     9try: 
     10  r = sock.connect(('127.0.0.1', 12345)) 
     11  sock.send('test message') 
     12except socket.error, e: 
     13  print 'Error: %s' % e 
     14}}} 
     15 
     16== ソケット.TCPサーバ == 
     17{{{ 
     18#!python 
     19import socket 
     20 
     21sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     22sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     23sock.bind(('127.0.0.1', 12345)) 
     24sock.listen(1) 
     25try: 
     26  while True: 
     27    (conn, sa) = sock.accept() 
     28    msg = conn.recv(8192) 
     29    print msg 
     30    conn.close() 
     31except socket.error, e: 
     32  print 'Error: %s' % e 
     33}}} 
     34 
     35== ソケット.TCPサーバ == 
     36{{{ 
     37#!python 
     38import SocketServer 
     39 
     40class Handler(SocketServer.StreamRequestHandler): 
     41  def handle(self): 
     42    while True: 
     43      line = self.rfile.readline() 
     44      if len(line) == 0: 
     45        return 
     46      self.wfile.write(line) 
     47 
     48server = SocketServer.TCPServer(('127.0.0.1', 12345), Handler) 
     49print 'listening:', server.socket.getsockname() 
     50server.serve_forever() 
     51}}} 
     52 * pythonの標準のものを使うともっとスマート。スレッド動作させるクラスもあるよ。 
     53 
     54== UDPクライアント == 
     55{{{ 
     56#!python 
     57try: 
     58  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     59  sock.sendto('test message', ('localhost', 12345)) 
     60except socket.error, e: 
     61  print 'Error: %s' % e 
     62~ 
     63}}} 
     64== RPCサーバ == 
     65{{{ 
     66#!python 
     67import SimpleXMLRPCServer 
     68 
     69class Test: 
     70  def inc1(self, value): 
     71    return value + 1 
     72 
     73  def inc2(self, value): 
     74    return value + 2 
     75 
     76  def inc3(self, value): 
     77    return value + 3 
     78 
     79if __name__ == '__main__': 
     80  server = SimpleXMLRPCServer.SimpleXMLRPCServer(('127.0.0.1', 12346)) 
     81  server.register_instance(Test()) 
     82  server.serve_forever() 
     83}}} 
     84 * 関数呼び出しのイメージで処理が進められるので便利。 
     85 * 特別なプロトコル自分で作る必要がない。 
     86 * '''練習問題:''' このサーバを起動して、一度だけRPCクライアントとの通信後サーバを`^C`で終了させてその直後にサーバをまた起動するとソケットがまだバインドされているというエラーがでてすぐに起動できない。さてどう改造したらうまく行くのでしょうか? 
     87 
     88== RPCクライアント == 
     89{{{ 
     90#!python 
     91import xmlrpclib 
     92 
     93server = xmlrpclib.ServerProxy('http://127.0.0.1:12346') 
     94print server.inc1(1) 
     95print server.inc2(1) 
     96print server.inc3(1) 
     97}}} 
     98 * 関数を呼ぶだけです。 
     99 
    1100== CGI == 
    2101{{{