明日のためのプログラムその7。Pythonことはじめ。の4
2020-02-02
ということで、socketのサーバの第一弾のテストの最終。
このあとクラスにしましょう。
#-------------------------------------------------------
import sys
import socket
import traceback
import time
#--------------------------------------
def localAccept(s):
try:
conn, addr = s.accept()
return conn, addr
except Exception as e:
if e.args[0]==10035 or e.args[0]==11:
return None,None
#--------------------------------------
def localRecv(conn,n):
try:
dat = conn.recv(n)
return dat
except Exception as e:
if e.args[0]==10035 or e.args[0]==11:
return None
#--------------------------------------
def RSOCKSV(address,port):
ct = 0;
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((address, port))
s.listen(10)
s.setblocking(False)
while True:
mes = "";
#------------------------------------------------
conn,addr = localAccept(s)
if conn==None:
if ct==0:
print("●\r",end="")
else:
print("〇\r",end="")
ct = ct + 1;
if ct == 2:
ct = 0
time.sleep(0.5)
continue
conn.setblocking(False) #LINUXだとこれをしないとrecvがblockingしてしまう
# with conn:
while True:
dat = localRecv(conn,3)
if not dat:
print("complete?");
break
mes = mes + dat.decode('utf8')
print(mes);
print("one cours !") #ここでThreadを生成させよう
time.sleep(1)
conn.sendall(b'complete?') #CLIENTに戻す
#--------------------------------------
if True:
RSOCKSV('127.0.0.1', 12345)
クライアント側。
まぁクライアント側はsendしてrecvするだけです。
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('127.0.0.1',12345))
s.sendall('----+----ひらひら1----+----2----+----3----+----4----+----5----+----6'.encode('utf-8'))
data = s.recv(1024)
print(repr(data))
結果
complete?
----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
one cours !
まぁこんな感じです。
if e.args[0]==10035 or e.args[0]==11:
のところは、linux(CentOS)でやってみたら例外11がでたので、ここらへんはまぁWinsockとの違いなので仕方ないとこです。
最終的に何をやりたいかっていうと、socket経由でmessageを受け取り、なんらかコマンドやらなにやらを実行させたいってことです。
で、ここまできて気が付きました。
この簡単さはなんだ!
って感じ。うぅーーん。こりゃPython、流行るわけだわね。(o^^o)