Pythonã®ãœã±ããå®è£ ãæ·±ãæãäžããåºç€ãšãªããããã¯ãŒã¯ã¹ã¿ãã¯ããããã³ã«ã®éžæãå ç¢ãªãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³æ§ç¯ã®ããã®å®è·µçãªäœ¿çšæ³ãæ¢ããŸãã
Pythonãããã¯ãŒã¯ã¹ã¿ãã¯ã培åºè§£èª¬ïŒãœã±ããå®è£ ã®è©³çް
çŸä»£ã®ã³ã³ãã¥ãŒãã£ã³ã°ã®çžäºæ¥ç¶ãããäžçã«ãããŠãã¢ããªã±ãŒã·ã§ã³ããããã¯ãŒã¯äžã§ã©ã®ããã«éä¿¡ããããçè§£ããããšã¯éåžžã«éèŠã§ããPythonã¯ããã®è±å¯ãªãšã³ã·ã¹ãã ãšäœ¿ããããã«ãããçµã¿èŸŒã¿ã®socketã¢ãžã¥ãŒã«ãéããŠãåºç€ãšãªããããã¯ãŒã¯ã¹ã¿ãã¯ãžã®åŒ·åã§ã¢ã¯ã»ã¹ããããã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãããã®å
æ¬çãªæ¢æ±ã§ã¯ãPythonã«ããããœã±ããå®è£
ã®è€éãªè©³çŽ°ã«æ·±ãå
¥ã蟌ã¿ãããã©ã³ã®ãããã¯ãŒã¯ãšã³ãžãã¢ããææ¬²çãªãœãããŠã§ã¢ã¢ãŒããã¯ããŸã§ãäžçäžã®éçºè
ã«ãšã£ãŠäŸ¡å€ããæŽå¯ãæäŸããŸãã
åºç€ïŒãããã¯ãŒã¯ã¹ã¿ãã¯ã®çè§£
Pythonã®å ·äœçãªå 容ã«å ¥ãåã«ããããã¯ãŒã¯ã¹ã¿ãã¯ã®æŠå¿µçãªãã¬ãŒã ã¯ãŒã¯ãææ¡ããããšãäžå¯æ¬ ã§ãããããã¯ãŒã¯ã¹ã¿ãã¯ã¯ãããŒã¿ããããã¯ãŒã¯ãä»ããŠã©ã®ããã«ç§»åããããå®çŸ©ããéå±€åã¢ãŒããã¯ãã£ã§ããæãåºãæ¡çšãããŠããã¢ãã«ã¯TCP/IPã¢ãã«ã§ãããã¯4ã€ãŸãã¯5ã€ã®å±€ã§æ§æãããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³å±€ïŒãŠãŒã¶ãŒåãã¢ããªã±ãŒã·ã§ã³ãååšããå±€ã§ããHTTPãFTPãSMTPãDNSãªã©ã®ãããã³ã«ããã®å±€ã§åäœããŸããPythonã®
socketã¢ãžã¥ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããããã¯ãŒã¯ãšããåãããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã - ãã©ã³ã¹ããŒãå±€ïŒç°ãªããã¹ãäžã®ããã»ã¹éã§ã®ãšã³ãããŒãšã³ãéä¿¡ãæ
åœããå±€ã§ããããã§ã®äž»èŠãª2ã€ã®ãããã³ã«ã¯æ¬¡ã®ãšããã§ãïŒ
- TCP (Transmission Control Protocol)ïŒã³ãã¯ã·ã§ã³æååã§ãä¿¡é Œæ§ãé«ããé åºä»ããããé ä¿¡ãããã³ã«ã§ããããŒã¿ãç Žæããããšãªããæ£ããé åºã§å°çããããšãä¿èšŒããŸããããªãŒããŒããããé«ããªããŸãã
- UDP (User Datagram Protocol)ïŒã³ãã¯ã·ã§ã³ã¬ã¹åã§ãä¿¡é Œæ§ãäœããé åºä»ããããªãé ä¿¡ãããã³ã«ã§ããããé«éã§ãªãŒããŒããããäœããããé床ãéèŠã§ãããããçšåºŠã®ããŒã¿æå€±ã蚱容ãããã¢ããªã±ãŒã·ã§ã³ïŒäŸïŒã¹ããªãŒãã³ã°ããªã³ã©ã€ã³ã²ãŒã ïŒã«é©ããŠããŸãã
- ã€ã³ã¿ãŒãããå±€ïŒãŸãã¯ãããã¯ãŒã¯å±€ïŒïŒè«çã¢ãã¬ã¹æå®ïŒIPã¢ãã¬ã¹ïŒãšãããã¯ãŒã¯ãä»ããããŒã¿ãã±ããã®ã«ãŒãã£ã³ã°ãåŠçããå±€ã§ããã€ã³ã¿ãŒããããããã³ã«ïŒIPïŒããã®å±€ã®èŠã§ãã
- ãªã³ã¯å±€ïŒãŸãã¯ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹å±€ïŒïŒãããã¯ãŒã¯åªäœïŒäŸïŒã€ãŒãµããããWi-FiïŒãä»ããããŒã¿ã®ç©ççãªéä¿¡ãæ±ãå±€ã§ããMACã¢ãã¬ã¹ãšãã¬ãŒã ã®ãã©ãŒããããåŠçããŸãã
- ç©çå±€ïŒãªã³ã¯å±€ã®äžéšãšã¿ãªãããããšãããïŒïŒã±ãŒãã«ãã³ãã¯ã¿ãªã©ããããã¯ãŒã¯ããŒããŠã§ã¢ã®ç©ççç¹æ§ãå®çŸ©ããå±€ã§ãã
Pythonã®socketã¢ãžã¥ãŒã«ã¯ãäž»ã«ã¢ããªã±ãŒã·ã§ã³å±€ãšãã©ã³ã¹ããŒãå±€ãšããåãããTCPãšUDPãæŽ»çšããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ããŒã«ãæäŸããŸãã
Pythonã®ãœã±ããã¢ãžã¥ãŒã«ïŒæŠèŠ
Pythonã®socketã¢ãžã¥ãŒã«ã¯ããããã¯ãŒã¯éä¿¡ãžã®ã²ãŒããŠã§ã€ã§ããããã¯BSDãœã±ããAPIãžã®äœã¬ãã«ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããBSDãœã±ããAPIã¯ã»ãšãã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãããã¯ãŒã¯ããã°ã©ãã³ã°ã®æšæºãšãªã£ãŠããŸããäžæ žãšãªãæœè±¡åã¯ãœã±ãããªããžã§ã¯ãã§ãããããã¯éä¿¡æ¥ç¶ã®1ã€ã®ãšã³ããã€ã³ãã衚ããŸãã
ãœã±ãããªããžã§ã¯ãã®äœæ
socketã¢ãžã¥ãŒã«ã䜿çšããäžã§ã®åºæ¬çãªã¹ãããã¯ããœã±ãããªããžã§ã¯ããäœæããããšã§ããããã¯socket.socket()ã³ã³ã¹ãã©ã¯ã¿ã䜿çšããŠè¡ããŸãã
import socket
# Create a TCP/IP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Create a UDP/IP socket
# s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.socket()ã³ã³ã¹ãã©ã¯ã¿ã¯äž»ã«2ã€ã®åŒæ°ãåããŸãã
familyïŒã¢ãã¬ã¹ãã¡ããªãŒãæå®ããŸããæãäžè¬çãªã®ã¯IPv4ã¢ãã¬ã¹çšã®socket.AF_INETã§ãããã®ä»ã®ãªãã·ã§ã³ã«ã¯IPv6çšã®socket.AF_INET6ããããŸããtypeïŒãœã±ããã¿ã€ããæå®ããéä¿¡ã»ãã³ãã£ã¯ã¹ã決å®ããŸãã- ã³ãã¯ã·ã§ã³æåã¹ããªãŒã ïŒTCPïŒã«ã¯
socket.SOCK_STREAMã䜿çšããŸãã - ã³ãã¯ã·ã§ã³ã¬ã¹ããŒã¿ã°ã©ã ïŒUDPïŒã«ã¯
socket.SOCK_DGRAMã䜿çšããŸãã
- ã³ãã¯ã·ã§ã³æåã¹ããªãŒã ïŒTCPïŒã«ã¯
äžè¬çãªãœã±ããæäœ
ãœã±ãããªããžã§ã¯ããäœæããããšãããŸããŸãªãããã¯ãŒã¯æäœã«äœ¿çšã§ããŸãããããã¯TCPãšUDPã®äž¡æ¹ã®ã³ã³ããã¹ãã§æ¢æ±ããŸãã
TCPãœã±ããå®è£ ã®è©³çް
TCPã¯ä¿¡é Œæ§ã®é«ãã¹ããªãŒã æåãããã³ã«ã§ããTCPã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ããµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã®äž¡æ¹ã§ããã€ãã®éèŠãªã¹ããããå¿ èŠã§ãã
TCPãµãŒããŒã®å®è£
TCPãµãŒããŒã¯éåžžãåä¿¡æ¥ç¶ãåŸ ã¡ãããããåãå ¥ãããã®åŸæ¥ç¶ãããã¯ã©ã€ã¢ã³ããšéä¿¡ããŸãã
1. ãœã±ããã®äœæ
ãµãŒããŒã¯TCPãœã±ãããäœæããããšããå§ããŸãã
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2. ãœã±ãããã¢ãã¬ã¹ãšããŒãã«ãã€ã³ããã
ãµãŒããŒã¯ãœã±ãããç¹å®ã®IPã¢ãã¬ã¹ãšããŒãçªå·ã«ãã€ã³ãããå¿ èŠããããŸããããã«ããããµãŒããŒã®ååšããããã¯ãŒã¯äžã§èªèãããŸãããã¹ãŠå©çšå¯èœãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãªãã¹ã³ããããã«ãã¢ãã¬ã¹ã¯ç©ºæååã«ããããšãã§ããŸãã
host = '' # Listen on all available interfaces
port = 12345
server_socket.bind((host, port))
bind()ã«é¢ããæ³šæïŒãã¹ããæå®ããéã空æååïŒ''ïŒã䜿çšããããšã¯ããµãŒããŒããããããããã¯ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ããã®æ¥ç¶ãåãå
¥ããããšãèš±å¯ããããã®äžè¬çãªæ
£è¡ã§ãããããã¯ã'127.0.0.1'ã®ãããªç¹å®ã®IPã¢ãã¬ã¹ãããŒã«ã«ãã¹ãçšã«ããŸãã¯ãµãŒããŒã®ãããªãã¯IPã¢ãã¬ã¹ãæå®ããããšãã§ããŸãã
3. åä¿¡æ¥ç¶ããªãã¹ã³ãã
ãã€ã³ãåŸããµãŒããŒã¯ãªãã¹ã³ç¶æ
ã«å
¥ããåä¿¡æ¥ç¶èŠæ±ãåãå
¥ããæºåãã§ããŸããlisten()ã¡ãœããã¯ãæå®ãããããã¯ãã°ãµã€ãºãŸã§æ¥ç¶èŠæ±ããã¥ãŒã«å
¥ããŸãã
server_socket.listen(5) # Allow up to 5 queued connections
print(f"Server listening on {host}:{port}")
listen()ã®åŒæ°ã¯ãã·ã¹ãã ãæ°ããæ¥ç¶ãæåŠããåã«ãã¥ãŒã«å
¥ãããæªæ¿èªã®æ¥ç¶ã®æå€§æ°ã§ããæ°å€ã倧ãããããšãé«è² è·æã®ããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãããããå€ãã®ã·ã¹ãã ãªãœãŒã¹ãæ¶è²»ããŸãã
4. æ¥ç¶ãåãå ¥ãã
accept()ã¡ãœããã¯ãã¯ã©ã€ã¢ã³ããæ¥ç¶ããã®ãåŸ
ã€ããããã³ã°åŒã³åºãã§ããæ¥ç¶ã確ç«ããããšãã¯ã©ã€ã¢ã³ããšã®æ¥ç¶ãè¡šãæ°ãããœã±ãããªããžã§ã¯ããšã¯ã©ã€ã¢ã³ãã®ã¢ãã¬ã¹ãè¿ããŸãã
while True:
client_socket, client_address = server_socket.accept()
print(f"Accepted connection from {client_address}")
# Handle the client connection (e.g., receive and send data)
handle_client(client_socket, client_address)
å
ã®server_socketã¯ãªãã¹ã³ã¢ãŒãã®ãŸãŸã§ãããããã«æ¥ç¶ãåãå
¥ããããšãã§ããŸããclient_socketã¯ãç¹å®ã®æ¥ç¶æžã¿ã¯ã©ã€ã¢ã³ããšã®éä¿¡ã«äœ¿çšãããŸãã
5. ããŒã¿ã®éåä¿¡
æ¥ç¶ãåãå
¥ãããããšãclient_socketäžã§recv()ããã³sendall()ïŒãŸãã¯send()ïŒã¡ãœããã䜿çšããŠããŒã¿ã亀æã§ããŸãã
def handle_client(client_socket, client_address):
try:
while True:
data = client_socket.recv(1024) # Receive up to 1024 bytes
if not data:
break # Client closed the connection
print(f"Received from {client_address}: {data.decode('utf-8')}")
client_socket.sendall(data) # Echo data back to client
except ConnectionResetError:
print(f"Connection reset by {client_address}")
finally:
client_socket.close() # Close the client connection
print(f"Connection with {client_address} closed.")
recv(buffer_size)ã¯ãœã±ããããæå€§buffer_sizeãã€ããèªã¿åããŸããrecv()ãäžåºŠã®åŒã³åºãã§ãã¹ãŠã®èŠæ±ãã€ããè¿ããªãå Žåãããããšã«æ³šæããããšãéèŠã§ããç¹ã«å€§éã®ããŒã¿ãäœéãªæ¥ç¶ã®å Žåã§ãããã¹ãŠã®ããŒã¿ãåä¿¡ãããããšãä¿èšŒããããã«ãã«ãŒããåãå¿
èŠãããããšããããããŸãã
sendall(data)ã¯ãããã¡å
ã®ãã¹ãŠã®ããŒã¿ãéä¿¡ããŸããsend()ãããŒã¿ã®äžéšã®ã¿ãéä¿¡ããéä¿¡ããããã€ãæ°ãè¿ãå Žåãããã®ã«å¯Ÿããsendall()ã¯ãã¹ãŠã®ããŒã¿ãéä¿¡ãããããšã©ãŒãçºçãããŸã§ããŒã¿ã®éä¿¡ãç¶è¡ããŸãã
6. æ¥ç¶ãéãã
éä¿¡ãçµäºãããšãããŸãã¯ãšã©ãŒãçºçãããšãã«ã¯ãã¯ã©ã€ã¢ã³ããœã±ãããclient_socket.close()ã䜿çšããŠéããã¹ãã§ãããµãŒããŒããã·ã£ããããŠã³ããããã«èšèšãããŠããå Žåã¯ãæçµçã«ãªãã¹ã³ãœã±ãããéããããšãã§ããŸãã
TCPã¯ã©ã€ã¢ã³ãã®å®è£
TCPã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒãžã®æ¥ç¶ãéå§ãããã®åŸããŒã¿ã亀æããŸãã
1. ãœã±ããã®äœæ
ã¯ã©ã€ã¢ã³ããTCPãœã±ãããäœæããããšããå§ããŸãã
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2. ãµãŒããŒã«æ¥ç¶ãã
ã¯ã©ã€ã¢ã³ãã¯connect()ã¡ãœããã䜿çšããŠããµãŒããŒã®IPã¢ãã¬ã¹ãšããŒããžã®æ¥ç¶ã確ç«ããŸãã
server_host = '127.0.0.1' # Server's IP address
server_port = 12345 # Server's port
try:
client_socket.connect((server_host, server_port))
print(f"Connected to {server_host}:{server_port}")
except ConnectionRefusedError:
print(f"Connection refused by {server_host}:{server_port}")
exit()
connect()ã¡ãœããã¯ããããã³ã°åŒã³åºãã§ãããµãŒããŒãå®è¡ãããŠããªãããæå®ãããã¢ãã¬ã¹ãšããŒãã§ã¢ã¯ã»ã¹ã§ããªãå ŽåãConnectionRefusedErrorãŸãã¯ãã®ä»ã®ãããã¯ãŒã¯é¢é£ã®äŸå€ãçºçããŸãã
3. ããŒã¿ã®éåä¿¡
æ¥ç¶ã確ç«ããããšãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒãšåãsendall()ããã³recv()ã¡ãœããã䜿çšããŠããŒã¿ãéåä¿¡ã§ããŸãã
message = "Hello, server!"
client_socket.sendall(message.encode('utf-8'))
data = client_socket.recv(1024)
print(f"Received from server: {data.decode('utf-8')}")
4. æ¥ç¶ãéãã
æåŸã«ãã¯ã©ã€ã¢ã³ãã¯å®äºããããœã±ããæ¥ç¶ãéããŸãã
client_socket.close()
print("Connection closed.")
TCPã«ããè€æ°ã¯ã©ã€ã¢ã³ãã®åŠç
äžèšã®åºæ¬çãªTCPãµãŒããŒå®è£
ã¯ãserver_socket.accept()ããã³ãã®åŸã®ã¯ã©ã€ã¢ã³ããœã±ãããšã®éä¿¡ãåäžã¹ã¬ããå
ã§ããããã³ã°æäœã§ãããããäžåºŠã«1ã€ã®ã¯ã©ã€ã¢ã³ãããåŠçããŸãããè€æ°ã®ã¯ã©ã€ã¢ã³ããåæã«åŠçããã«ã¯ã次ã®ãããªææ³ã䜿çšããå¿
èŠããããŸãã
- ã¹ã¬ããåŠçïŒåãå ¥ããã¯ã©ã€ã¢ã³ãæ¥ç¶ããšã«ãéä¿¡ãåŠçããããã®æ°ããã¹ã¬ãããçæããŸããããã¯ç°¡åã§ãããã¹ã¬ããã®ãªãŒããŒãããã®ãããéåžžã«å€ãã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠã¯ãªãœãŒã¹éçŽçã«ãªãå¯èœæ§ããããŸãã
- ãã«ãããã»ã¹åŠçïŒã¹ã¬ããåŠçãšäŒŒãŠããŸãããå¥ã®ããã»ã¹ã䜿çšããŸããããã«ãããããè¯ãåé¢ãæäŸãããŸãããããã»ã¹ééä¿¡ã®ã³ã¹ããé«ããªããŸãã
- éåæI/OïŒ
asyncioã䜿çšïŒïŒããã¯Pythonã«ããã髿§èœãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³åãã®ææ°ãã€å¥œãŸããã¢ãããŒãã§ããåäžã®ã¹ã¬ããã§å€ãã®I/Oæäœããããã¯ããããšãªãåæã«ç®¡çã§ããŸãã select()ãŸãã¯selectorsã¢ãžã¥ãŒã«ïŒãããã®ã¢ãžã¥ãŒã«ã¯ãåäžã®ã¹ã¬ãããè€æ°ã®ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ïŒãœã±ãããå«ãïŒã®æºåç¶æ³ãç£èŠããããšãå¯èœã«ããè€æ°ã®æ¥ç¶ãå¹ççã«åŠçã§ããŸãã
ã§ã¯ãå€ãselect.select()ãããæè»ã§é«æ§èœãªä»£æ¿ææ®µã§ããselectorsã¢ãžã¥ãŒã«ã«ã€ããŠç°¡åã«è§ŠããŠã¿ãŸãããã
selectorsã䜿çšããäŸïŒæŠå¿µçãªãµãŒããŒïŒïŒ
import socket
import selectors
import sys
selector = selectors.DefaultSelector()
# ... (server_socket setup and bind as before) ...
server_socket.listen()
server_socket.setblocking(False) # Crucial for non-blocking operations
selector.register(server_socket, selectors.EVENT_READ, data=None) # Register server socket for read events
print("Server started, waiting for connections...")
while True:
events = selector.select() # Blocks until I/O events are available
for key, mask in events:
if key.fileobj == server_socket: # New incoming connection
conn, addr = server_socket.accept()
conn.setblocking(False)
print(f"Accepted connection from {addr}")
selector.register(conn, selectors.EVENT_READ, data=addr) # Register new client socket
else: # Data from an existing client
sock = key.fileobj
data = sock.recv(1024)
if data:
print(f"Received {data.decode()} from {key.data}")
# In a real app, you'd process data and potentially send response
sock.sendall(data) # Echo back for this example
else:
print(f"Closing connection from {key.data}")
selector.unregister(sock) # Remove from selector
sock.close() # Close socket
selector.close()
ãã®äŸã¯ãåäžã®ã¹ã¬ããããœã±ããã®èªã¿åãã€ãã³ããç£èŠããããšã§ãè€æ°ã®æ¥ç¶ã管çããæ¹æ³ã瀺ããŠããŸãããœã±ãããèªã¿åãå¯èœã«ãªã£ããšãïŒããªãã¡ãèªã¿åãããŒã¿ãããããæ°ããæ¥ç¶ãä¿çäžã®å ŽåïŒãã»ã¬ã¯ã¿ãèµ·åããã¢ããªã±ãŒã·ã§ã³ã¯ä»ã®æäœããããã¯ããããšãªããã®ã€ãã³ããåŠçã§ããŸãã
UDPãœã±ããå®è£ ã®è©³çް
UDPã¯ã³ãã¯ã·ã§ã³ã¬ã¹ã®ããŒã¿ã°ã©ã æåãããã³ã«ã§ããTCPãããã·ã³ãã«ã§é«éã§ãããé ä¿¡ãé åºãéè€ä¿è·ã«é¢ããä¿èšŒã¯ãããŸããã
UDPãµãŒããŒã®å®è£
UDPãµãŒããŒã¯äž»ã«ãæ°žç¶çãªæ¥ç¶ã確ç«ããããšãªããåä¿¡ããŒã¿ã°ã©ã ããªãã¹ã³ããå¿çãéä¿¡ããŸãã
1. ãœã±ããã®äœæ
UDPãœã±ãããäœæããŸãã
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2. ãœã±ããã®ãã€ã³ã
TCPãšåæ§ã«ããœã±ãããã¢ãã¬ã¹ãšããŒãã«ãã€ã³ãããŸãã
host = ''
port = 12345
server_socket.bind((host, port))
print(f"UDP server listening on {host}:{port}")
3. ããŒã¿ã®éåä¿¡ïŒããŒã¿ã°ã©ã ïŒ
UDPãµãŒããŒã®äžæ žãšãªãæäœã¯ããŒã¿ã°ã©ã ã®åä¿¡ã§ããrecvfrom()ã¡ãœããã䜿çšãããããŒã¿ã ãã§ãªãéä¿¡å
ã®ã¢ãã¬ã¹ãè¿ããŸãã
while True:
data, client_address = server_socket.recvfrom(1024) # Receive data and sender's address
print(f"Received from {client_address}: {data.decode('utf-8')}")
# Send a response back to the specific sender
response = f"Message received: {data.decode('utf-8')}"
server_socket.sendto(response.encode('utf-8'), client_address)
recvfrom(buffer_size)ã¯åäžã®ããŒã¿ã°ã©ã ãåä¿¡ããŸããUDPããŒã¿ã°ã©ã ã¯åºå®ãµã€ãºïŒæå€§64KBã§ãããå®éã«ã¯ãããã¯ãŒã¯MTUã«ãã£ãŠå¶éãããŸãïŒã§ããããšã«æ³šæããããšãéèŠã§ããããŒã¿ã°ã©ã ããããã¡ãµã€ãºãã倧ããå ŽåãåãæšãŠãããŸããTCPã®recv()ãšã¯ç°ãªããrecvfrom()ã¯åžžã«å®å
šãªããŒã¿ã°ã©ã ïŒãŸãã¯ãããã¡ãµã€ãºå¶éãŸã§ïŒãè¿ããŸãã
sendto(data, address)ã¯æå®ãããã¢ãã¬ã¹ã«ããŒã¿ã°ã©ã ãéä¿¡ããŸããUDPã¯ã³ãã¯ã·ã§ã³ã¬ã¹ã§ããããããã¹ãŠã®éä¿¡æäœã§å®å
ã¢ãã¬ã¹ãæå®ããå¿
èŠããããŸãã
4. ãœã±ãããéãã
å®äºããããµãŒããŒãœã±ãããéããŸãã
server_socket.close()
UDPã¯ã©ã€ã¢ã³ãã®å®è£
UDPã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«ããŒã¿ã°ã©ã ãéä¿¡ãããªãã·ã§ã³ã§å¿çããªãã¹ã³ã§ããŸãã
1. ãœã±ããã®äœæ
UDPãœã±ãããäœæããŸãã
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2. ããŒã¿ãéä¿¡ãã
sendto()ã䜿çšããŠããµãŒããŒã®ã¢ãã¬ã¹ã«ããŒã¿ã°ã©ã ãéä¿¡ããŸãã
server_host = '127.0.0.1'
server_port = 12345
message = "Hello, UDP server!"
client_socket.sendto(message.encode('utf-8'), (server_host, server_port))
print(f"Sent: {message}")
3. ããŒã¿ã®åä¿¡ïŒãªãã·ã§ã³ïŒ
å¿çãæåŸ
ããå Žåã¯ãrecvfrom()ã䜿çšã§ããŸãããã®åŒã³åºãã¯ããŒã¿ã°ã©ã ãåä¿¡ããããŸã§ãããã¯ãããŸãã
data, server_address = client_socket.recvfrom(1024)
print(f"Received from {server_address}: {data.decode('utf-8')}")
4. ãœã±ãããéãã
client_socket.close()
TCPãšUDPã®äž»ãªéããšäœ¿ãåã
TCPãšUDPã®éžæã¯ããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã®èšèšã«ãããŠåºæ¬çã§ãã
- ä¿¡é Œæ§ïŒTCPã¯é ä¿¡ãé åºããšã©ãŒãã§ãã¯ãä¿èšŒããŸããUDPã¯ä¿èšŒããŸããã
- æ¥ç¶ïŒTCPã¯ã³ãã¯ã·ã§ã³æåã§ãããããŒã¿è»¢éã®åã«æ¥ç¶ã確ç«ãããŸããUDPã¯ã³ãã¯ã·ã§ã³ã¬ã¹ã§ãããããŒã¿ã°ã©ã ã¯ç¬ç«ããŠéä¿¡ãããŸãã
- é床ïŒUDPã¯ãªãŒããŒããããå°ãªããããäžè¬çã«é«éã§ãã
- è€éãïŒTCPã¯ä¿¡é Œæ§ã®ããéä¿¡ã®å€ãã®è€éããåŠçããã¢ããªã±ãŒã·ã§ã³éçºãç°¡çŽ åããŸããUDPã¯ãå¿ èŠã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ãä¿¡é Œæ§ã管çããå¿ èŠããããŸãã
- ãŠãŒã¹ã±ãŒã¹ïŒ
- TCPïŒWebãã©ãŠãžã³ã°ïŒHTTP/HTTPSïŒãã¡ãŒã«ïŒSMTPïŒããã¡ã€ã«è»¢éïŒFTPïŒãã»ãã¥ã¢ã·ã§ã«ïŒSSHïŒãªã©ãããŒã¿ã®æŽåæ§ãéèŠãªå Žåã
- UDPïŒã¹ããªãŒãã³ã°ã¡ãã£ã¢ïŒãããª/ãªãŒãã£ãªïŒããªã³ã©ã€ã³ã²ãŒã ãDNSã«ãã¯ã¢ãããVoIPãªã©ãäœé å»¶ãšé«ã¹ã«ãŒããããããã¹ãŠã®ãã±ããã®ç¢ºå®ãªé ä¿¡ãããéèŠãªå Žåã
é«åºŠãªãœã±ããã®æŠå¿µãšãã¹ããã©ã¯ãã£ã¹
åºæ¬ãè¶ ããŠãããã€ãã®é«åºŠãªæŠå¿µãšãã©ã¯ãã£ã¹ã¯ããããã¯ãŒã¯ããã°ã©ãã³ã°ã¹ãã«ãåäžãããããšãã§ããŸãã
ãšã©ãŒåŠç
ãããã¯ãŒã¯æäœã¯ãšã©ãŒãçºçããããã§ããå
ç¢ãªã¢ããªã±ãŒã·ã§ã³ã¯ãsocket.errorãConnectionRefusedErrorãTimeoutErrorãªã©ã®äŸå€ããã£ããããããã«ãtry...exceptãããã¯ã䜿çšããå
æ¬çãªãšã©ãŒåŠçãå®è£
ããå¿
èŠããããŸããç¹å®ã®ãšã©ãŒã³ãŒããçè§£ããããšã¯ãåé¡ã®èšºæã«åœ¹ç«ã¡ãŸãã
ã¿ã€ã ã¢ãŠã
ãããã¯ãŒã¯ãŸãã¯ãªã¢ãŒããã¹ããå¿çããªããªã£ãå Žåãããããã³ã°ãœã±ããæäœã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã indefinitely ãã³ã°ããå¯èœæ§ããããŸãããããé²ãããã«ã¯ã¿ã€ã ã¢ãŠãã®èšå®ãäžå¯æ¬ ã§ãã
# For TCP client
client_socket.settimeout(10.0) # Set a 10-second timeout for all socket operations
try:
client_socket.connect((server_host, server_port))
except socket.timeout:
print("Connection timed out.")
except ConnectionRefusedError:
print("Connection refused.")
# For TCP server accept loop (conceptual)
# While selectors.select() provides a timeout, individual socket operations might still need them.
# client_socket.settimeout(5.0) # For operations on the accepted client socket
éããããã³ã°ãœã±ãããšã€ãã³ãã«ãŒã
selectorsã¢ãžã¥ãŒã«ã§ç€ºãããŠããããã«ãéããããã³ã°ãœã±ãããã€ãã³ãã«ãŒãïŒasyncioãŸãã¯selectorsã¢ãžã¥ãŒã«ã«ãã£ãŠæäŸããããã®ãªã©ïŒãšçµã¿åãããããšã¯ãã¹ã¬ããã®ççºãªãã«å€æ°ã®æ¥ç¶ãåæã«åŠçã§ãããã¹ã±ãŒã©ãã«ã§å¿çæ§ã®é«ããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éµã§ãã
IPããŒãžã§ã³6 (IPv6)
IPv4ã¯äŸç¶ãšããŠåºãæ®åããŠããŸãããIPv6ã®éèŠæ§ã¯å¢ããŠããŸããPythonã®socketã¢ãžã¥ãŒã«ã¯socket.AF_INET6ãéããŠIPv6ããµããŒãããŠããŸããIPv6ã䜿çšããå Žåãã¢ãã¬ã¹ã¯æååïŒäŸïŒ'2001:db8::1'ïŒãšããŠè¡šçŸãããç¹ã«ãã¥ã¢ã«ã¹ã¿ãã¯ïŒIPv4ãšIPv6ïŒç°å¢ãæ±ãéã«ã¯ãå€ãã®å Žåç¹å¥ãªåŠçãå¿
èŠã§ãã
äŸïŒIPv6 TCPãœã±ããã®äœæïŒ
ipv6_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
ãããã³ã«ãã¡ããªãŒãšãœã±ããã¿ã€ã
AF_INET (IPv4) ãš AF_INET6 (IPv6) ãSOCK_STREAM (TCP) ãŸã㯠SOCK_DGRAM (UDP) ãšçµã¿åãããã®ãæãäžè¬çã§ããããœã±ããAPIã¯åããã·ã³äžã§ã®ããã»ã¹ééä¿¡ã®ããã®AF_UNIXã®ãããªä»ã®ãã¡ããªãŒããµããŒãããŠããŸãããããã®ããªãšãŒã·ã§ã³ãçè§£ããããšã§ãããå€çšéãªãããã¯ãŒã¯ããã°ã©ãã³ã°ãå¯èœã«ãªããŸãã
é«ã¬ãã«ã©ã€ãã©ãª
å€ãã®äžè¬çãªãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãã¿ãŒã³ã§ã¯ãããé«ã¬ãã«ã®Pythonã©ã€ãã©ãªã䜿çšããããšã§ãéçºãå€§å¹ ã«ç°¡çŽ åããå ç¢ã§ååã«ãã¹ãããããœãªã¥ãŒã·ã§ã³ãæäŸã§ããŸããäŸãšããŠã¯æ¬¡ã®ãã®ããããŸãã
http.clientããã³http.serverïŒHTTPã¯ã©ã€ã¢ã³ããšãµãŒããŒãæ§ç¯ãããããftplibããã³ftp.serverïŒFTPã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ãããsmtplibããã³smtpdïŒSMTPã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ãããasyncioïŒé«æ§èœãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãå«ãéåæã³ãŒããæžãããã®åŒ·åãªãã¬ãŒã ã¯ãŒã¯ã§ãããœã±ããã€ã³ã¿ãŒãã§ãŒã¹äžã«æ§ç¯ãããç¬èªã®ãã©ã³ã¹ããŒããšãããã³ã«ã®æœè±¡åãæäŸããŸããTwistedãTornadoã®ãããªãã¬ãŒã ã¯ãŒã¯ïŒãããã¯æçããã€ãã³ãé§ååãããã¯ãŒã¯ããã°ã©ãã³ã°ãã¬ãŒã ã¯ãŒã¯ã§ãããè€éãªãããã¯ãŒã¯ãµãŒãã¹ãæ§ç¯ããããã®ããæ§é åãããã¢ãããŒããæäŸããŸãã
ãããã®ã©ã€ãã©ãªã¯äœã¬ãã«ã®ãœã±ãã詳现ã®äžéšãæœè±¡åããŸãããåºç€ãšãªããœã±ããå®è£ ãçè§£ããããšã¯ããããã°ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãããã³ã«ã¹ã¿ã ãããã¯ãŒã¯ãœãªã¥ãŒã·ã§ã³ã®æ§ç¯ã«ãããŠäŸç¶ãšããŠéåžžã«äŸ¡å€ããããŸãã
ãããã¯ãŒã¯ããã°ã©ãã³ã°ã«ãããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªå©çšè ã察象ãšãããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãéçºããéã«ã¯ãããã€ãã®èŠçŽ ãèæ ®ãããŸãã
- æåãšã³ã³ãŒãã£ã³ã°ïŒåžžã«æåãšã³ã³ãŒãã£ã³ã°ã«æ³šæããŠãã ãããUTF-8ãããã¡ã¯ãã¹ã¿ã³ããŒãã§ããåŒ·ãæšå¥šãããŸãããããŒã¿ç Žæãé¿ããããã«ããã¹ãŠã®ãããã¯ãŒã¯åå è
éã§äžè²«ãããšã³ã³ãŒãã£ã³ã°ãšãã³ãŒãã£ã³ã°ã確ä¿ããŠãã ãããPythonã®
.encode('utf-8')ãš.decode('utf-8')ã¯ããã§ããªãã®æé«ã®å人ã§ãã - ã¿ã€ã ãŸãŒã³ïŒã¢ããªã±ãŒã·ã§ã³ãã¿ã€ã ã¹ã¿ã³ããã¹ã±ãžã¥ãŒãªã³ã°ãæ±ãå Žåãç°ãªãã¿ã€ã ãŸãŒã³ãæ£ç¢ºã«åŠçããããšãäžå¯æ¬ ã§ããæéãUTCã§ä¿åãã衚瀺ç®çã§å€æããããšãæ€èšããŠãã ããã
- åœéåïŒI18nïŒãšããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒL10nïŒïŒãŠãŒã¶ãŒåãã¡ãã»ãŒãžã«ã€ããŠã¯ãç¿»èš³ãšæåçé©å¿ãèšç»ããŠãã ãããããã¯ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®æžå¿µäºé ã§ãããéä¿¡ããå¯èœæ§ã®ããããŒã¿ã«åœ±é¿ãäžããŸãã
- ãããã¯ãŒã¯é å»¶ãšä¿¡é Œæ§ïŒã°ããŒãã«ãããã¯ãŒã¯ã«ã¯ãããŸããŸãªã¬ãã«ã®é å»¶ãšä¿¡é Œæ§ã䌎ããŸãããããã®å€åã«å¯ŸããŠå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãèšèšããŠãã ãããäŸãã°ãTCPã®ä¿¡é Œæ§æ©èœã䜿çšããããUDPçšã«å詊è¡ã¡ã«ããºã ãå®è£ ãããããŸãããŠãŒã¶ãŒã®é å»¶ãæžããããã«ãè€æ°ã®å°ççå°åã«ãµãŒããŒããããã€ããããšãæ€èšããŠãã ããã
- ãã¡ã€ã¢ãŠã©ãŒã«ãšãããã¯ãŒã¯ãããã·ïŒã¢ããªã±ãŒã·ã§ã³ã¯ããã¡ã€ã¢ãŠã©ãŒã«ããããã·ãªã©ã®äžè¬çãªãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ãééã§ããããã«èšèšããå¿ èŠããããŸããæšæºããŒãïŒHTTPã®80ãHTTPSã®443ãªã©ïŒã¯ãã°ãã°éããŠããŸãããã«ã¹ã¿ã ããŒãã«ã¯æ§æãå¿ èŠãªå ŽåããããŸãã
- ããŒã¿ãã©ã€ãã·ãŒèŠå¶ïŒäŸïŒGDPRïŒïŒã¢ããªã±ãŒã·ã§ã³ãå人ããŒã¿ãåŠçããå Žåãç°ãªãå°åã®é¢é£ããããŒã¿ä¿è·æ³ãèªèããéµå®ããŠãã ããã
çµè«
Pythonã®socketã¢ãžã¥ãŒã«ã¯ãåºç€ãšãªããããã¯ãŒã¯ã¹ã¿ãã¯ãžã®åŒ·åã§çŽæ¥çãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããéçºè
ãå¹
åºããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ããŸããTCPãšUDPã®éããçè§£ããã³ã¢ãœã±ããæäœãç¿åŸããéããããã³ã°I/Oããšã©ãŒåŠçã®ãããªé«åºŠãªæè¡ãæ¡çšããããšã§ãå
ç¢ã§ã¹ã±ãŒã©ãã«ãã€å¹ççãªãããã¯ãŒã¯ãµãŒãã¹ãäœæã§ããŸãã
ã·ã³ãã«ãªãã£ããã¢ããªã±ãŒã·ã§ã³ã忣ã·ã¹ãã ããŸãã¯é«ã¹ã«ãŒãããã®ããŒã¿åŠçãã€ãã©ã€ã³ãæ§ç¯ããŠãããã©ããã«ãããããããœã±ããå®è£ ã®è©³çްããã£ãããšçè§£ããããšã¯ã仿¥ã®æ¥ç¶ãããäžçã§åãPythonéçºè ã«ãšã£ãŠäžå¯æ¬ ãªã¹ãã«ã§ããã¢ããªã±ãŒã·ã§ã³ãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ä¿¡é Œæ§ã®é«ããã®ã§ããããšã確å®ã«ããããã«ãèšèšäžã®æ±ºå®ãã°ããŒãã«ã«äžãã圱é¿ãåžžã«èæ ®ããããšãå¿ããªãã§ãã ããã
楜ããã³ãŒãã£ã³ã°ããæ¥œãããããã¯ãŒã¯ã掻çšããŸãããïŒ