树莓派TCP传输协议(socket通信) 一发一收与多发多收

项目场景:

一个物联网系统中,硬件与Web后端的通信肯定是必不可少的。笔者在每个项目中都会自己模拟发送端与接收端来实现树莓派收到的各模块数据能通过TCP协议上传给电脑。笔者在这里提供自己一直都有在用的一发一收与多发多收两类TCP通信模块的代码


一发一收:

笔者在网上收到的很多TCP通信代码都是一发一收式的。就是发送端(服务端)与接收端(客户端)之间在发完数据后,必须等待对方回复数据后才能发送自己的信息。在这里笔者提供一对代码。
发送端(服务端) fa.py代码:

# coding=UTF-8
import socket
import cv2
import numpy
import time
import smbus
import math
def SendVideo():
    address = ('0.0.0.0', 8888)
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(address)
    except socket.error as msg:
        print(msg)
        sys.exit(1)
    data1=b''
    while 1:
        time.sleep(0.1)
        sock.send(b'123');
        
        data1=sock.recv()
        if len(data1): print(str(data1, encoding='utf-8'))
        data1=b''

if __name__ == '__main__':
    SendVideo()

接收端(客户端) shou.py代码:

# coding=UTF-8
import os
import sys
import time
import socket
import time
import cv2
import numpy
def ReceiveVideo():
    address = ('0.0.0.0', 8888)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(address)
    s.listen(6)
    data=b''
    while 1:
        data = sock.recv(5)
        print(data)
        # 。
        # 。
        # 。
        # 将1234回传,主要目的是测试可以双向通信
        time.sleep(0.1)
        sock.send(b'1234')
        data=b''
if __name__ == '__main__':
    ReceiveVideo()

上述代码中address = (‘0.0.0.0’, 8888)为(IP地址+端口号) 都需要填写接收端(客户端)用户电脑的IP地址,后面的端口号可以自义定,但两边必须一样。两个代码必须在不同的电脑桌面上运行。由于笔者没有俩电脑。。。自己模拟时是在putty里运行fa.py代码,在电脑自带的远程电脑连接中远程访问的树莓派桌面中运行shou.py代码(注意:电脑自带的远程桌面连接中的桌面与树莓派桌面不是同一个桌面 但VNC远程桌面与树莓派是同一个 可能会运行失败)。
在这里插入图片描述


多发多收:

笔者所做的项目大都是监测类的。接收的代码也多是报警一类的指令(led或蜂鸣器报警)。所以数据是会一直发送的,因此一发一收式的代码并不太适用。笔者也因此花了大量时间,终于找到了收发不受影响的代码,以达到多发多收的效果。
发送端(服务端) fa.py代码:

#coding=utf-8
import socket
import cv2
import numpy
import time
import smbus
import math

def SendVideo():
    address = ('0.0.0.0', 8080) # 地址:IP+端口号
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建sock对象
        sock.connect(address) # 与客户端连接
    except socket.error as msg: # 判断连接是否发生错误
        print(msg)
        sys.exit(1)
    data=b''    
    while 1:
        time.sleep(0.1)
        sock.send(b'123');
        
        sock.settimeout(1) # 计时1秒,若无信息接收则关闭recv
        try:
            data=sock.recv(10)
            print(data)
        except socket.timeout as e:
            #print(f"{e}")
            continue

if __name__ == '__main__':
    SendVideo()

接收端(客户端) shou.py代码:

# coding=UTF-8
import os
import sys
import time
import socket
import time
import cv2
import numpy
def ReceiveVideo():
    address = ('0.0.0.0', 8888)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(address)
    s.listen(6)
    data=b''
    while 1:
        data = sock.recv(5)
        time.sleep(3)
        print(data)
        # 。
        # 。
        # 。
        # 将1234回传,主要目的是测试可以双向通信
        time.sleep(0.1)
        sock.send(b'1234')
        data=b''
if __name__ == '__main__':
    ReceiveVideo()

上述发送端 fa.py代码多了计时代码(sock.settimeout(1))。通过这种方式在发送端1秒内若无数据传回则直接关闭recv。以此达到收发不受对方限制。
此外,接收端除了用shou.py代码来模拟外,也可以用网络调试助手来实现。不过笔者在自己电脑上没有运行成功,但是在同项目组Web端人员那边可以实现。可能是需要不同电脑的原因。不过在这里能够更加直观的看出自己发送的数据是否有误,是否会受到客户端数据的影响。
在这里插入图片描述


参考资料与总结:

PC和树莓派socket通信 控制LED
树莓派和PC间TCP通信
希望本博客能在树莓派TCP通信上给读者一定的帮助,省下找各种解决方案的时间成本。感谢各位观看,如有不足,欢迎在评论内留言与讨论。如果觉得写得好的,可以给我点赞+收藏+关注哦,再次感谢各位!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47390133/article/details/113520060