当前位置: 首页 > article >正文

websocket:两台PC间数据传输

项目要求在两台PC间进行图像传输,写了个小小的例子,如下:

服务器端:

import os
from socket import *
import base64


# 图片解码
def base64_decode_img(base64_code):
    """
    :param base64_code: base64编码
    :return: 二进制据,直接写入保存为图片
    """
    img_bytes = base64.b64decode(base64_code)
    return img_bytes


class WebSocketServer:
    def __init__(self, host="127.0.0.1", port=8001):
        self.socket = socket()
        self.host = host
        self.port = port

    def bind(self):
        """监听套接字"""
        self.socket.bind((self.host, self.port))
        self.socket.listen()  # 设置监听套接字

    def bind_connection(self):
        """建立连接"""
        while True:
            print("等待连接....")
            conn, addr = self.socket.accept()  # 连接 conn是连接对象;addr=(host,port)
            print(f"连接到:{addr[0]}\t端口:{addr[1]}")
            return conn, addr

    def close(self):
        """ 关闭监听套接字"""
        self.socket.close()


class Connection:
    def __init__(self, conn, addr):
        self.conn = conn
        self.addr = addr
        self.save_path = "recv/"
        self.flag = False

    def close(self):
        """断开连接"""
        self.conn.close()
        print(f"{self.addr[0]}:{self.addr[1]}断开连接")

    def send_msg(self, message):
        """发送信息"""
        self.conn.send(message.encode())

    def receive_msg(self, bufsize=1024):
        """接受信息"""
        data_received = self.conn.recv(bufsize).decode()
        return data_received

    def handle(self, count):
        if not os.path.exists(self.save_path):
            os.makedirs(self.save_path)
        img_data = "" # 需要存储的图片数据
        while True:
            data = self.receive_msg()  # 持续获取该对象信息
            if data:
                img_data += data
            else:
                self.flag = True
                break
        d = base64_decode_img(img_data)
        with open(f"{self.save_path}/{count}.jpg", "wb") as f:
            f.write(d) if d else None


if __name__ == '__main__':
    webserver = WebSocketServer(host="127.0.0.1", port=8001)
    webserver.bind()
    count = 0
    while True:
        conn, addr = webserver.bind_connection()
        con = Connection(conn, addr)
        while True:
            con.handle(count)
            count += 1
            print(f"完成{count}")
            if con.flag: break

功能是接收客户端传来的图,并放进recv文件夹下。

客户端:

import time
import cv2
import os
import base64
from socket import *


class Client:
    def __init__(self, host="127.0.0.1", port=8001):
        self.host = host
        self.port = port
        self.socket = self.connect()

    def connect(self):
        tcp_socket = socket()
        tcp_socket.connect((self.host, self.port))
        return tcp_socket
    
    # 发送的是编码,有些项目中就不需要保存路径,直接发送编码了
    def base64_encode_img(self, img_data):
        _, image_encoded = cv2.imencode('.jpg', img_data)
        image_bytes = image_encoded.tobytes()
        image_base64 = base64.b64encode(image_bytes).decode('utf-8')
        return image_base64

    def get_img(self, img_path):
        img = cv2.imread(img_path)
        img_d = self.base64_encode_img(img)
        img_b = img_d.encode()
        return img_b

    def send_msg(self, msg):
        self.socket.send(msg.encode())

    def send_img(self, img_path):
        img_data = self.get_img(img_path)
        n = 0
        while True:
            self.socket.send(img_data[n:n + 1024])
            n += 1024
            if n > len(img_data):
                print(f"已发送:{img_path}")
                break

    def close(self):
        self.socket.close()


if __name__ == '__main__':

    path = "/home/tx207/Desktop/img1"   # 图片路径
    # path = "C:/Users/cheng/Desktop/Spider/gulinazha"
    # path = "C:/Users/cheng/Desktop/Spider/boduo"
    pics = os.listdir(path)
    for pic in pics:
        C = Client(host="192.168.253.168", port=8001)
        p_p = path + "/" + pic
        C.send_img(p_p)  # 发送单张图片
        C.close()

运行服务器端程序时,出现报错:

Traceback (most recent call last):
  File "server.py", line 79, in <module>
    webserver.bind()
  File "server.py", line 24, in bind
    self.socket.bind((self.host, self.port))
OSError: [Errno 99] Cannot assign requested address

这种情况说明服务器无法绑定端口IP,一顿搜索后发现了问题所在:

在你的服务器上,这里host后面所跟的,必须是内网IP,而不是公网IP。

但是!在这里写内网IP之后,你在浏览器访问的时候还是用公网IP去进行访问!

如果你不知道你的内网IP的多少,那么,你可以写”0.0.0.0”,它表示你服务器上所有的IP都会被监听。也就是说,你可以这样弄:

webserver = WebSocketServer(host="0.0.0.0", port=8001)

经验证,运行成功!

在这里,要感谢大神!http://t.csdnimg.cn/2iVsw


http://www.kler.cn/a/288714.html

相关文章:

  • SpringBoot参数注解
  • 性能测试|JMeter接口与性能测试项目
  • 相机光学(四十二)——sony的HDR技术
  • DNS面临的4大类共计11小类安全风险及防御措施
  • macOS解决U盘装完系统容量变小的问题
  • 词嵌入方法(Word Embedding)
  • Leetcode 146. LRU 缓存(Medium)
  • 【知识库系列】MPR/多模态方向观察:图像视频与3D生成
  • 你的专利真的值钱吗?五重标准检验,让你的创新价值飙升
  • 深度学习:革新药物心脏毒性预测的新篇章
  • 局域网通信时,解决在一些设备上NsdManager发现服务失败的问题
  • 9_3_LineEdit
  • 抓取海外电商平台数据时,是否最好使用当地的IP?
  • 基础闯关4
  • 数学建模常用工具总结
  • 关于Linux(CentOS 7)中的用户sudo命令
  • 知识付费小程序搭建:开启知识变现新时代
  • 采用SIP封装的传感器系列:ARS19510LUBBTN、A19520LUBBTN、A1696PKHTN、A1694PKLN-RNZBE(资料)
  • Learning——protobuf的下载
  • 【Springboot服务实现类】用户登录逻辑梳理(未完待续)
  • 【管理型文档】软件需求管理过程(原件)
  • 使用 ip route 命令配置 Linux 路由表的详细指南
  • AI BT人工智能交互平台应用程序重磅上线,开启全球数字革命
  • 探索 HarmonyOS NEXT Developer Beta6,开启创新应用
  • 钢铁百科:NM360钢板材质、NM360机械性能、NM360韧性焊接性能
  • 多场景建模: STAR(Star Topology Adaptive Recommender)