您的位置:首页 > 新闻 > 会展 > websocket:两台PC间数据传输

websocket:两台PC间数据传输

2024/10/5 22:25:50 来源:https://blog.csdn.net/chiyiwei7384/article/details/141642553  浏览:    关键词: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_bytesclass WebSocketServer:def __init__(self, host="127.0.0.5", port=8000):self.socket = socket()self.host = hostself.port = portdef 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, addrdef close(self):""" 关闭监听套接字"""self.socket.close()class Connection:def __init__(self, conn, addr):self.conn = connself.addr = addrself.save_path = "recv/"self.flag = Falsedef 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_receiveddef 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 += dataelse:self.flag = Truebreakd = base64_decode_img(img_data)with open(f"{self.save_path}/{count}.jpg", "wb") as f:f.write(d) if d else Noneif __name__ == '__main__':webserver = WebSocketServer(host="192.168.253.168", port=8001)webserver.bind()count = 0while True:conn, addr = webserver.bind_connection()con = Connection(conn, addr)while True:con.handle(count)count += 1print(f"完成{count}")if con.flag: breakcon.close();

功能是接收客户端传来的图,并放进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 = hostself.port = portself.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_base64def get_img(self, img_path):img = cv2.imread(img_path)img_d = self.base64_encode_img(img)img_b = img_d.encode()return img_bdef send_msg(self, msg):self.socket.send(msg.encode())def send_img(self, img_path):img_data = self.get_img(img_path)n = 0while True:self.socket.send(img_data[n:n + 1024])n += 1024if n > len(img_data):print(f"已发送:{img_path}")breakdef 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)C = Client(host="192.168.253.168", port=8001)for pic in pics:p_p = path + "/" + picC.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 bindself.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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com