||
一、网络调试助手
二、UDP发送数据
代码如下:
import socket #创建接收信息的地址,利用本机网络调试助手调试时,要与调试助手显示的本地IP地址相同 HOST='192.168.233.1' PORT=8080 addr = (HOST,PORT) #创建UDP套接字对象 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.connect(addr) while True: message = input('请输入要发送的信息:>>') s.sendto(message.encode('gb2312'),addr) #message是字符串,要转化成gb2312字节形式。 # data = s.recvfrom(addr) # print(data) s.close()
上述代码运行发送信息,网络调试助手接收信息。
三、UDP接收数据
如下图,网络调试助手显示接收数据来自IP地址192.168.233.1 ,端口为59250和61665,这是我们每次运行程序,占用的端口是变化的。
代码如下:
import socket #创建发送信息的地址,利用本机网络调试助手调试时,要与调试助手显示的本地IP地址相同 HOST='192.168.233.1' PORT=8080 # host = socket.gethostname() #绑定一个端口 addr = (HOST,PORT) #创建UDP套接字对象 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.bind((HOST, 8089)) #绑定的是本机,端口为8089 s.connect(addr) while True: message = input('请输入要发送的信息:>>') s.sendto(message.encode('gb2312'),addr) #message是字符串,要转化成gb2312字节形式。 data = s.recvfrom(1024) #本次接收的最大字节数为1024。 print('接收到%s的消息是%s'%(data[1],data[0].decode('gb2312'))) s.close()
使用bind函数后,调试助手的目标端口就固定为8089,见下图:
四、多线程
第三部分的代码,接收和发送信息是受限制的,即‘发送’-‘接收’循环。而实际上我们希望发送和接收信息互不影响,这就需要多线程。
import socket import threading #创建发送信息的地址,利用本机网络调试助手调试时,要与调试助手显示的本地IP地址相同 HOST='192.168.233.1' PORT=8080 addr = (HOST,PORT) #创建UDP套接字对象 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.bind((HOST, 8089)) #绑定的是本机IP和端口为8089 # 定义两个任务 def recv_fun(): while True: recv_data = s.recvfrom(1024) print('接收%s:%s' % (recv_data[1], recv_data[0].decode('gb2312'))) def send_fun(): while True: message = input('请输入要发送的信息:>>') send_data = s.sendto(message.encode('gb2312'),addr) print('发送%s' % (send_data)) if __name__ == '__main__': #创建两个线程 t1 = threading.Thread(target=send_fun) t2 = threading.Thread(target=recv_fun) t1.start() t2.start() t1.join() t2.join()
我们发现可以实现连续发送和接收信息了:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-29 12:46
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社