文章目录

  • 利用Socket搭建客户端和服务端
    • 简易Socket收发
      • 服务端的搭建
      • 客户端的搭建
    • 真正的视频socket收发
      • 服务端
      • PC端客户端
    • 进行测试
  • 源码github地址

利用Socket搭建客户端和服务端

我是真的不习惯jupyterNotebook编程,所以现在PC上写好两个端的程序再把服务器端弄过去吧。

简易Socket收发

服务端的搭建

先简单尝试一下怎么用Socket搭一个小服务器

老规矩,遇事不决看例程

其最简例程为

# Echo server program
import socketHOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.bind((HOST, PORT))s.listen(1)conn, addr = s.accept()with conn:print('Connected by', addr)while True:data = conn.recv(1024)if not data: breakconn.sendall(data)

所以搭建一个socket_service需要啥呢?
首先是创建一个对象

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#############对于with那句

然后要有host和port,这个port不妨就取4000,然后host设为本机的’127.0.0.1’

s.bind(('127.0.0.1', 4000))

然后就是这个listen了参数是啥意思嘞
官方文档
给出的信息是

socket.listen([backlog])
允许服务器接受连接。如果指定了backlog,它必须至少为0(如果更低,则设置为0);它指定在拒绝新连接之前系统将允许的未接受连接的数量。如果未指定,则选择一个默认的合理值。

那我们就设置个1好了,反正自己连

s.listen(1)

最后就是accept接受数据了

接受一个连接。socket必须绑定到一个地址并监听连接。返回值是一对(conn, address),其中conn是用于在连接上发送和接收数据的新套接字对象,address是绑定到连接另一端套接字的地址。
新创建的socket不可继承。

按照例程的用法,只需要一次s.accept就可以了。

 conn, addr = s.accept()with conn:print('Connected by', addr)while True:data = conn.recv(1024)if not data: breakconn.sendall(data)

里面recv的参数在官方文档的描述为

socket.recv(bufsize[, flags])
从socket接收数据。返回值是一个字节对象,表示接收到的数据。一次接收的最大数据量由bufsize指定。有关可选参数标志的含义,请参阅Unix手册中的recv(2)页;它默认为零。
注意,为了更好地匹配硬件和网络现实,bufsize的值应该是相对较小的2的幂,例如4096。

客户端的搭建

其例程为

# Echo client program
import socketHOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.connect((HOST, PORT))s.sendall(b'Hello, world')data = s.recv(1024)
print('Received', repr(data))

大概意思就是我们的client端只需要进行socket对象的建立、链接、sendall命令就行了。

简单写一下,分别运行两个程序,我的host设置在了本机127.0.0.1上,可以看到成功运行了。


将其地址改为192.168.2.99并把server放到pynq上,也可以成功

真正的视频socket收发

主要参考这篇资料进行的视频客户端与服务端的修改。1

服务端

首先进行Server的初始化,如之前的test一样。

class SocketServer:'''进行SocketServer的初始化配置'''def __init__(self,addr="",port = 8880) -> None:self.resolution = (1920,1080) # 分辨率self.img_fps = 30 # 帧率self.Set_Socket(addr,port) # 调用设置Socket的方法def Set_Socket(self,addr,port):self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) ## 允许端口复用self.server.bind((addr,port))self.server.listen(5) # 允许连接数量print("addr:",addr,"port:",port)

接下来的重点就是将图片编码然后发出,用cv2将其编码为jpg格式然后发就行了

    while(1):# 读取一帧视频server.img = hdmi_in.readframe()server.img = cv2.resize(server.img, server.resolution)# 按格式生成图片img_encode = cv2.imencode('.jpg',server.img,img_param)img_code = numpy.array(img_encode[1])server.img_data = img_code.tostring()client.send(struct.pack("lhh",len(server.img_data),server.resolution[0],server.resolution[1]) + server.img_data)

需要主要的是原文中的img_code = numpy.array(img_encode)需要修改为现在的img_code = numpy.array(img_encode[1]),看print结果可知img_encode是True和一个array合成的tuple,如果不这么写会报错。我们只需要发送array的内容就可以了。

PC端客户端

PC端前半部分配置与test类似
读取图像解码仍然需要用到cv2。这块按照大佬的程序来就可以了。

            info=struct.unpack("lhh",self.client.recv(8))buf_size=info[0]                    #获取读的图片总长度if buf_size:try:self.buf=b""                #代表bytes类型temp_buf=self.bufwhile(buf_size):            #读取每一张图片的长度temp_buf=self.client.recv(buf_size)buf_size-=len(temp_buf)self.buf+=temp_buf      #获取图片data = numpy.fromstring(self.buf, dtype='uint8')    #按uint8转换为图像矩阵self.image = cv2.imdecode(data, 1)                  #图像解码cv2.imshow(self.name, self.image)                   #展示图片except:passfinally:if(cv2.waitKey(10)==27):        #每10ms刷新一次图片,按‘ESC’(27)退出self.client.close()cv2.destroyAllWindows()break

进行测试

在pynq上运行服务端,在pc上运行客户端,会弹出窗口。我是把手机连了一根hdmi线到pynq上,可以看到手机内容。

理论上将只要pynq和电脑处于同一个局域网下,就能够在电脑上查看连入pynq的hdmi输出视频。
以后没有hdmi显示设备的时候可以拿电脑先看一下了。
还可以用pynq同时进行服务器视频输出和hdmi out。

这两天在搜一些关于pynq上的神经网络的资料2 3的时候,发现这个MJPG方式可能也不错,以后有空试试吧。

源码github地址

Github地址
CSDN下载地址

广告时间
FPGA入门
FPGA实战训练精粹
Xilinx FPGA权威设计指南:基于Vivado 2018集成开发环境
Xilinx Zynq7020
FPGA设计技巧与案例开发详解(第2版)


  1. PYNQ-Z2调试笔记:基于PYNQ-Z2的远程人脸检测程序 ↩︎

  2. 基于PYNQ的神经网络自动驾驶小车-搭建神经网络 ↩︎

  3. 树莓派 USB摄像头 实现网络监控( MJPG-Streamer) ↩︎

PYNQ 采集计划(二)Socket服务端与客户端的搭建,pynq到pc的数据流传输相关推荐

  1. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  2. 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

    HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...

  3. php socket(服务端与客户端)demo

    php socket(服务端与客户端)demo完整演示: 环境是:[phpstydy,PHP版本7.3.4nts],一定要开启[sockets]服务. 服务器[index.php](源码复制即可): ...

  4. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  5. Java高级补充(Socket服务端、客户端)、Handler类、安卓Socket传数据、WebView

    Socket服务端简单地API: 主要用到以下几个API:ServerSocket用来设置端口号.accept用来和服务端连接.getInputStream用来获取输入流.read用来读取输入流里面的 ...

  6. 封装网络通信 socket 服务端和客户端

    文章目录 1.C++封装的socket 服务端 1.1 代码示例 1.2 代码解析 1.2.1 成员变量 1.2.2 成员函数 1.2.3 构造函数和析构函数 1.2.4 服务端类解析 2.C++封装 ...

  7. cas单点登录学习:cas服务端与客户端的搭建

    单点登录:英文名称(Single Sign On),简称sso,是目前比较流行的服务于企业业务整合的解决方案之一,SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 然 ...

  8. socket客户端和服务器通信协议,51. Socket服务端和客户端使用TCP协议通讯

    Socket服务器是网络服务中常用的服务器.使用 go 语言实现这个业务场景是很容易的. 这样的网络通讯,需要一个服务端和至少一个客户端. 我们计划构建一个这样的通讯过程.服务端启动后等待客户端的访问 ...

  9. 【开源项目】Socket服务端与客户端传输视频文件

    TCP Server端 #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h ...

最新文章

  1. MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》
  2. linux与windows下tomcat的java内存设置
  3. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】
  4. 前端学习(1714):前端系列javascript之项目配置
  5. 配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景
  6. 单应矩阵,基本矩阵,本质矩阵
  7. windows7 64位 php5.3安装php_mongo.dll方法 各个版本
  8. elcipse 中利用maven创建web工程
  9. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
  10. 20190930每日一句
  11. 基于Spring Boot的人力资源管理系统
  12. DNS服务器的安装与配置
  13. 软件开发需要学什么?
  14. PAT 乙级1068 万绿丛中一点红(20 分)
  15. 笔记本电脑上的触摸板怎样关闭(神州战神)
  16. 美眉都是可爱的…… (美图)
  17. keras指定gpu_Keras多GPU训练指南
  18. 运维系统常用健康度模型浅析
  19. 人脸表情系列——人脸表情识别(Facial Expression Recognization/FER)
  20. 基于MaxCompute+开放搜索的电商、零售行业搜索开发实践

热门文章

  1. 研发管理-质量与效率提升-混沌工程在携程的实践
  2. 【基础算法训练】—— 01背包 + 排序
  3. [ctfshow]web入门——文件上传(web156-web163)
  4. 初步理解pagerank算法
  5. 完美实现PC端软件控制手机(无需安装任何APK)(一)
  6. 辽宁计算机考研学校二本,二本院校逆袭985到底有多难?
  7. W7 关闭 ss 无法上网 解决方法
  8. rsync实现断点续传
  9. 侍魂服务器维护,侍魂胧月传说6月3日停机维护更新公告
  10. alertdialog旋转屏幕消失造成leak window