ソケット通信(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()
同期となるとマルチスレッドで動かす必要がでてきそうだ。