Windows UWP 应用程序可以连接到 websocket 服务器,从中接收数据并显示数据吗?
Can a Windows UWP application connect to a websocket server, receive data from it, and display the data?
这是我在 Whosebug 上的第一个真正的问题。
我目前正在尝试将现有的 websocket 服务器实现到我的 UWP(C# 或 C++)应用程序中。服务器是 运行 来自我的笔记本电脑,正在接收屏幕截图数据。我想将此屏幕截图数据发送到我的 UWP 应用程序,然后在那里显示它。我也想要音频。有点像远程桌面的情况。这可能吗?如果可以,有人可以解释一下这是如何工作的吗?
这是我的 python 当前截图发送方法的代码。它绝不是完美的,而且非常慢。
import cv2 as cv
import numpy as np
import os
import sys
import socket
from PIL import ImageGrab
import pickle
from mss import mss
import struct
from time import time
from windowcapture import WindowCapture
# Client Side Initialization
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
bounding_box = {'top': 100, 'left':0, 'width':852, 'height':480}
sct = mss()
# Change the working directory to the folder this script is in.
os.chdir(os.path.dirname(os.path.abspath(__file__)))
#not used atm
# initialize the WindowCapture class
# wincap = WindowCapture('FL Studio 20')
loop_time = time()
while(True):
sct_img = sct.grab(bounding_box)
cv2.imshow('screen', np.array(sct_img))
# get an updated image of the game
#screenshot = wincap.get_screenshot()
#cv.imshow('Computer Vision', screenshot)
# debug the loop rate
print('FPS {}'.format(1 / (time() - loop_time)))
loop_time = time()
#send client data
frame = np.array(sct_img)
data = pickle.dumps(frame)
#send message length first
message_size = struct.pack("L", len(data))
#then data
clientsocket.sendall(message_size + data)
# press 'q' with the output window focused to exit.
# waits 1 ms every loop to process key presses
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
print('Done.')
quit()
这是服务器端代码:
import pickle
import socket
import struct
import cv2
HOST = ''
PORT = 8089
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED
while True:
# Retrieve message size
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('Capture Server Test', frame)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
break
谢谢!
决定通过互联网传输内容是一大步。这涉及端口转发、良好的 client/server 设置和实际代码。 Some examples from microsoft 让我开始建立 TCP 连接。
如果您的目标只是传输您自己的数据,TCP 可能会起作用。如果您需要直播或只需要音频和视频,也许其他协议更适合您。
总的来说,一个答案无法解释太多,因此我建议您研究以下关键事项,这将引导您建立稳固的联系:
- 如果你想让它远程工作,从另一个网络到你的家庭网络,你需要端口转发。 Here is some guide for it by a fantastic guy. This will allow your packages to go through your router without being blocked. And please, when something does not seem to work, try your firewall and/or try to demilitarize 你的 server/PC.
- 从理论上考虑您希望计算机如何通信。这取决于您的计算机科学知识,但一般来说,最好为两种设备赋予特定角色:一个充当客户端,另一个充当服务器。为了让网络和东西(端口转发)按预期运行,服务器应该监听客户端发送的数据包,服务器对此做出反应。这样,只有服务器需要端口转发,客户端可以从任何地方联系服务器。客户端发送请求,服务器响应。
- 有了计划,就去实施吧!这可能看起来很大,哇,但是 the examples from Microsoft for C# 帮了我很大的忙。您只需更改一些 IP 内容即可使其在您的环境中工作,但真正的内核工作正常。但是我怀疑它是否适合你的场景,因为我不知道你是想发送任意数据包还是完整的流。好像是后者,所以你可能想看看其他代码。
正如我之前提到的,这是非常全球化的,但你的问题也是如此。从头开始,提出更精确的问题,你就会到达那里。 :)
这是我在 Whosebug 上的第一个真正的问题。 我目前正在尝试将现有的 websocket 服务器实现到我的 UWP(C# 或 C++)应用程序中。服务器是 运行 来自我的笔记本电脑,正在接收屏幕截图数据。我想将此屏幕截图数据发送到我的 UWP 应用程序,然后在那里显示它。我也想要音频。有点像远程桌面的情况。这可能吗?如果可以,有人可以解释一下这是如何工作的吗?
这是我的 python 当前截图发送方法的代码。它绝不是完美的,而且非常慢。
import cv2 as cv
import numpy as np
import os
import sys
import socket
from PIL import ImageGrab
import pickle
from mss import mss
import struct
from time import time
from windowcapture import WindowCapture
# Client Side Initialization
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
bounding_box = {'top': 100, 'left':0, 'width':852, 'height':480}
sct = mss()
# Change the working directory to the folder this script is in.
os.chdir(os.path.dirname(os.path.abspath(__file__)))
#not used atm
# initialize the WindowCapture class
# wincap = WindowCapture('FL Studio 20')
loop_time = time()
while(True):
sct_img = sct.grab(bounding_box)
cv2.imshow('screen', np.array(sct_img))
# get an updated image of the game
#screenshot = wincap.get_screenshot()
#cv.imshow('Computer Vision', screenshot)
# debug the loop rate
print('FPS {}'.format(1 / (time() - loop_time)))
loop_time = time()
#send client data
frame = np.array(sct_img)
data = pickle.dumps(frame)
#send message length first
message_size = struct.pack("L", len(data))
#then data
clientsocket.sendall(message_size + data)
# press 'q' with the output window focused to exit.
# waits 1 ms every loop to process key presses
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
print('Done.')
quit()
这是服务器端代码:
import pickle
import socket
import struct
import cv2
HOST = ''
PORT = 8089
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED
while True:
# Retrieve message size
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('Capture Server Test', frame)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
break
谢谢!
决定通过互联网传输内容是一大步。这涉及端口转发、良好的 client/server 设置和实际代码。 Some examples from microsoft 让我开始建立 TCP 连接。
如果您的目标只是传输您自己的数据,TCP 可能会起作用。如果您需要直播或只需要音频和视频,也许其他协议更适合您。
总的来说,一个答案无法解释太多,因此我建议您研究以下关键事项,这将引导您建立稳固的联系:
- 如果你想让它远程工作,从另一个网络到你的家庭网络,你需要端口转发。 Here is some guide for it by a fantastic guy. This will allow your packages to go through your router without being blocked. And please, when something does not seem to work, try your firewall and/or try to demilitarize 你的 server/PC.
- 从理论上考虑您希望计算机如何通信。这取决于您的计算机科学知识,但一般来说,最好为两种设备赋予特定角色:一个充当客户端,另一个充当服务器。为了让网络和东西(端口转发)按预期运行,服务器应该监听客户端发送的数据包,服务器对此做出反应。这样,只有服务器需要端口转发,客户端可以从任何地方联系服务器。客户端发送请求,服务器响应。
- 有了计划,就去实施吧!这可能看起来很大,哇,但是 the examples from Microsoft for C# 帮了我很大的忙。您只需更改一些 IP 内容即可使其在您的环境中工作,但真正的内核工作正常。但是我怀疑它是否适合你的场景,因为我不知道你是想发送任意数据包还是完整的流。好像是后者,所以你可能想看看其他代码。
正如我之前提到的,这是非常全球化的,但你的问题也是如此。从头开始,提出更精确的问题,你就会到达那里。 :)