Python-ネットワークプログラミング:udpチャット(半二重)
2664 ワード
参照コード:
注意:プログラムがreceiveを開始していない場合、すでにデータが来ており、オペレーティングシステムがデータ(ファイアウォールなどのセキュリティ保護ソフトウェアがこのポートを通過したデータを指す)を受信すると、オペレーティングシステムは先にデータを保存し、プログラムがreceiveを開くと取り出します.
# :
# : 。
# :
# : ,
# : , ( : )
import socket
def send():
# 1. udp
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.
local_addr = ("", 7898)
udp_socket.bind(local_addr)
# ip
dest_ip = input(" ip:")
try:
dest_port = int(input(" :"))
except:
print("error input!")
# 3.
while True:
msg = input("(enter 'exit' to quit!)>")
#
# udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
if msg == 'exit':
print('bye!')
break
#
# recvfrom ,
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
print("recive msg:%s"% recv_msg)
if recv_msg == 'exit':
break
# 4.
udp_socket.close()
def recive():
# 1. udp
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.
local_addr = ("", 7788)
udp_socket.bind(local_addr)
# ip
dest_ip = input(" ip:")
try:
dest_port = int(input(" :"))
except:
print("error input!")
# 3.
while True:
#
# recvfrom ,
recv_data = udp_socket.recvfrom(1024)
# print(recv_data)
recv_msg = recv_data[0].decode('utf-8')
print("recive msg:%s"% recv_msg)
if recv_msg == 'exit':
break
msg = input("(enter 'exit' to quit!)>")
#
# udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
if msg == 'exit':
print('bye!')
break
# 4.
udp_socket.close()
if __name__ == "__main__":
func = ('exit', send, recive)
choosenum = int(input("please enter which func to do(1:send, 2:recive):"))
if choosenum<3 and choosenum>0:
func[choosenum]()
注意:プログラムがreceiveを開始していない場合、すでにデータが来ており、オペレーティングシステムがデータ(ファイアウォールなどのセキュリティ保護ソフトウェアがこのポートを通過したデータを指す)を受信すると、オペレーティングシステムは先にデータを保存し、プログラムがreceiveを開くと取り出します.