ソケット通信(UDP)

2010/10/8

Python2.5.4

ソケット通信のプロトコルは、主にTCPとUDPが使われる。 UDPは単純で高速。ただしデータはよく損失する。リアルタイム同期などに用いられる。

受信した内容をクライアント全員に返すサーバ

import socket

host = 'localhost'
port =  50007
bufsize = 4096

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.settimeout(0.01)
sock.bind((host,port))

clients = []

while True:
    try:
        string,addr = sock.recvfrom(bufsize)
        ip,pro_no = addr
        msg = "[%s][%s] %s" %(ip,pro_no,string)
        print msg
        clients.append(addr)
        clients = list(set(clients))
        for addr in clients:
            sock.sendto(msg,addr)

    except socket.error, e:
        if str(e) != "timed out":
            print 'Error: %s' % e

クライアントの管理は別途する必要がある。

サーバに送信するだけのクライアント

import socket

host = 'localhost'
port =  50007
bufsize = 4096

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.settimeout(0.01)
sock.connect((host,port))

while True:
    msg = raw_input()
    if msg != '':
        sock.send(msg)

サーバのデータを受信するだけのクライアント
import socket

host = 'localhost'
port =  50007
bufsize = 4096

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.settimeout(0.01)
sock.connect((host,port))
sock.send("new connect")

while True:
    try:
        string = sock.recv(bufsize)
        print string
    except socket.error, e:
        if str(e) != "timed out":
            print 'Error: %s' % e

受信と送信を同時に出来るクライアントにするには、例えばこんな感じ

import threading
import socket

host = 'localhost'
port =  50007
bufsize = 4096

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.settimeout(0.01)
sock.connect((host,port))
sock.send("new connect")

def mainloop():
    while True:
        msg = raw_input()
        if msg != '':
            sock.send(msg)


class Receiver(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)

    def run(self):
        while True:
            try:
                msg = sock.recv(bufsize)
                print msg
            except socket.error, e:
                if str(e) != "timed out":
                    print 'Error: %s' % e


if __name__ == "__main__":
    r = Receiver()
    r.start()
    mainloop()

同期となるとマルチスレッドで動かす必要がでてきそうだ。