python使用UDP协议进行远程桌面共享

之前在写远程桌面共享的时候一直没有思路,直到搜到了这篇文章:
(具体实现原理过程请看原文)
python实现基于UDP的视频直播程序

对我启发很大,但还有两个问题:
1.画质太低,导致连桌面上的文字都难辨认
2.存在色变,画面崩坏

解决办法

import threading
import time
import numpy
import cv2 as cv
from PIL import ImageGrab
from PIL import Image
from io import BytesIO

#因为开发需要,我将接收端的IP与端口写进配置文件
ip_inifile=open("ip.ini","r")
ipasport=ip_inifile.read()
ipAndport=ipasport.split(":")#拆分字符串
ip=ipAndport[0]	#接收端IP
port=ipAndport[1]	#接收端端口

def jiep_send():
 while True:
  ip_adder=(ip,int(port))
  #截取桌面
  img=ImageGrab.grab()
  #传输使用UDP协议,将图片分辨率变小方便传输,将ANTIALIAS作为第二个参数即可一定程度上提高画质
  out=img.resize((650,400),Image.ANTIALIAS)
  #申请一块内存块
  stram_0=BytesIO()
  #将图片以JPEG格式图片的方式保存至内存块
  out.save(stram_0,format='JPEG')
  #将内存块当作图片文件打开,并转为数组
  jp_array=numpy.array(Image.open(stram_0))
  stram_0.close()
  #再申请一个内存块
  stram_1=BytesIO()
  pic=Image.fromarray(jp_array)
  #将图片保存至新申请的内存块,以JPEG图片格式
  pic.save(stram_1,format='JPEG')
  #提取内存块中的值
  jpeg=stram_1.getvalue()
  stram_1.close()
  #设置UDP链接
  socket_0=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  #是否正常发送
  try:
   socket_0.sendto(jpeg,ip_adder)
  #断线重连机制,每三秒重拨一次
  except Exception as e:
   while True:
    try:
     socket_0.sendto(jpeg,ip_adder)
    except Exception as e:
     time.sleep(3)
    else:
     break
  else:
   pass
  finally:
   socket_0.close()

def _winmain()
 #因为开发需要我这里用了一个新线程来传输画面
 t1=threading.Thread(target=jiep_send)
 t1.start()
 
 if __name__=='__main__':
 _winmain()

这里基本上都是https://blog.csdn.net/qq_35488769/article/details/75500755
这位大佬的代码
我对这段代码的改动就是
out=img.resize((650,400),Image.ANTIALIAS)
out=img.resize((650,400),Image.ANTIALIAS)
将ANTIALIAS作为第二个参数,以此尽可能提高画质
(虽然画质还是不高,但是起码能够辨认出汉字字符惹。。。)

接收端代码

#_*_ coding:utf-8 _*_
import pyHook
import pythoncom
import socket
import os
import numpy 
import cv2 as cv
from PIL import ImageGrab
from PIL import Image
from PIL import ImageFilter
from io import BytesIO
import threading

def jiep_recv(ip_port):
 socket_0=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 socket_0.bind((socket.gethostname(),ip_port))
 while True:
  try:
   img_data,address=socket_0.recvfrom(1024*1024)
  except Exception as e:
   cv.destroyAllWindows()
  else:
   #申请内存块,并将收到的UDP数据放进内存块
   buf=BytesIO(img_data)
   #将收到的UDP数据转为数组
   img_data=numpy.array(Image.open(buf))
   #这一步作用重要,image类颜色格式为RGB,cv图片颜色格式为BGR故要将颜色格式进行转化,否则将色变
   img_data_1=cv.cvtColor(img_data,cv.COLOR_RGB2BGR)
   img_data_1=cv.resize(img_data_1,(850,500),)
   #显示图片
   cv.imshow("Service",img_data_1)
   buf.close()
   cv.waitKey(1)


def _winmains_():
 print 20*"*"+"xxxx"+20*"*"
 port=int(input("请输入接收端口:"))
 if port>65534:
  print "端口号过大!"
  return
 else:
  t1=threading.Thread(target=jiep_recv,args=(port,))
  t1.start()
#开发需要,用了一个新线程

if __name__=='__main__':
 _winmains_()

接收端主要利用img_data_1=cv.cvtColor(img_data,cv.COLOR_RGB2BGR)这句代码来将RGB转换为BGR,以此来解决色变的问题

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Python设计UDP协议需要以下几个步骤: 1. 导入socket模块,创建socket对象 ``` import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 其中,`AF_INET`表示使用IPv4协议,`SOCK_DGRAM`表示使用UDP协议。 2. 绑定IP地址和端口号 ``` udp_socket.bind(('127.0.0.1', 8888)) ``` 这里将IP地址设置为本地回环地址`127.0.0.1`,端口号设置为`8888`。 3. 发送数据 ``` udp_socket.sendto(data, (dest_ip, dest_port)) ``` 其中,`data`表示要发送的数据,`(dest_ip, dest_port)`表示目标IP地址和端口号。 4. 接收数据 ``` recv_data, (src_ip, src_port) = udp_socket.recvfrom(1024) ``` 其中,`recv_data`表示接收到的数据,`(src_ip, src_port)`表示发送方的IP地址和端口号。 完整的UDP通信示例: ``` import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.bind(('127.0.0.1', 8888)) data = 'hello, world!'.encode('utf-8') dest_ip = '127.0.0.1' dest_port = 8889 udp_socket.sendto(data, (dest_ip, dest_port)) recv_data, (src_ip, src_port) = udp_socket.recvfrom(1024) print('received from {}:{}'.format(src_ip, src_port)) print(recv_data.decode('utf-8')) udp_socket.close() ``` ### 回答2: 使用Python设计UDP协议可以通过socket模块实现。首先,我们需要创建一个UDP套接字,并指定IP地址和端口号。 ```python import socket UDP_IP = "127.0.0.1" # 设置本地IP地址 UDP_PORT = 5005 # 设置本地端口号 # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定IP地址和端口号 sock.bind((UDP_IP, UDP_PORT)) ``` 然后,我们可以使用`sendto`函数发送数据报文,使用`recvfrom`函数接收数据报文。 ```python # 发送数据报文 message = "Hello, UDP!" sock.sendto(message.encode(), (UDP_IP, UDP_PORT)) # 接收数据报文 data, addr = sock.recvfrom(1024) print("Received message:", data.decode()) ``` 在发送数据报文时,需要将字符串编码为字节流;而在接收数据报文时,需要将字节流解码为字符串。 最后,我们可以关闭UDP套接字。 ```python # 关闭UDP套接字 sock.close() ``` 这样,我们就使用Python设计了一个基本的UDP协议使用UDP协议进行通信时,需要注意数据报文的大小限制和丢包的可能性。 ### 回答3: Python提供了socket模块来实现基于UDP协议的网络通信。下面是使用Python设计UDP协议的基本过程: 1. 导入socket模块: ``` python import socket ``` 2. 创建UDP套接字: ``` python udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 其中,`AF_INET`表示使用IPv4地址族,`SOCK_DGRAM`表示使用数据报套接字,即UDP。 3. 绑定套接字到指定的IP地址和端口: ``` python udp_socket.bind(('127.0.0.1', 8888)) ``` 这里将UDP套接字绑定到本地IP地址`127.0.0.1`和端口`8888`。 4. 接收数据: ``` python data, addr = udp_socket.recvfrom(1024) ``` `recvfrom`方法用于接收数据,返回接收到的数据以及发送方的地址。 5. 发送数据: ``` python udp_socket.sendto(data, ('127.0.0.1', 9999)) ``` `sendto`方法用于发送数据,第一个参数为要发送的数据,第二个参数为接收方的地址。 6. 关闭套接字: ``` python udp_socket.close() ``` 使用完套接字后需要关闭释放。 以上就是使用Python设计UDP协议的基本过程。通过创建UDP套接字、绑定地址和端口、接收和发送数据,可以实现基于UDP协议的网络通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值