青未了分享 http://blog.sciencenet.cn/u/yanghang

博文

基于UDP的Socket编程——发送/接收数据

已有 6192 次阅读 2021-7-30 17:03 |个人分类:Python|系统分类:科研笔记

一、网络调试助手

image.png

二、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()

上述代码运行发送信息,网络调试助手接收信息。

image.png


三、UDP接收数据

如下图,网络调试助手显示接收数据来自IP地址192.168.233.1 ,端口为59250和61665,这是我们每次运行程序,占用的端口是变化的。

image.png

代码如下:

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,见下图:

image.png


四、多线程

第三部分的代码,接收和发送信息是受限制的,即‘发送’-‘接收’循环。而实际上我们希望发送和接收信息互不影响,这就需要多线程。

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()

我们发现可以实现连续发送和接收信息了:

image.png




https://blog.sciencenet.cn/blog-346157-1297664.html

上一篇:Tensorflow2.0中的梯度带(GradientTape)
下一篇:TFTP文件下载器
收藏 IP: 210.72.27.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-29 12:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部