- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
编辑
我弄清楚了问题所在,但现在我遇到了另一个问题。我想从另一台 PC 远程控制一台 PC,那部分工作,但你必须转发端口。是否可以像 TeamViewer 一样连接?所以我绕过防火墙并且不必转发端口?如果是,如何?如果有人能帮助我,那就太棒了:)
原帖
我编写了一个代码,这样您就可以从另一台计算机控制一台计算机。唯一的问题是它不适用于您自己网络之外的计算机(也许我连接了错误的 IP?我尝试了那个人的 IPv4 和来自 WhatIsMyIP 的 IP)。我怎样才能使它适用于我的网络外部?
这是服务器类(我删除了很多代码,因为它没有意义)
public partial class Form1 : Form
{
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
private const int MOUSE_LEFTDOWN = 0x02;
private const int MOUSE_LEFTUP = 0x04;
private const int MOUSE_RIGTDOWN = 0x08;
private const int MOUSE_RIGHTUP = 0x10;
private TcpListener listener;
private Socket mainSocket;
private int port;
private Stream s;
private Thread eventWatcher;
private int imageDelay;
string connString;
string connToString;
string db;
MySqlCommand command;
MySqlCommand command2;
MySqlCommand command3;
MySqlCommand command4;
MySqlConnection connection = null;
public Form1()
{
InitializeComponent();
port = 1338;
imageDelay = 1000;
}
public Form1(int p)
{
port = p;
imageDelay = 1000;
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show(getIP());
startConnection();
command = connection.CreateCommand();
command2 = connection.CreateCommand();
command3 = connection.CreateCommand();
command4 = connection.CreateCommand();
MessageBox.Show(connString);
MessageBox.Show(db);
this.Hide();
port = 1338;
while (true)
{
try
{
startListening();
}
catch (Exception)
{
}
}
}
public void startListening()
{
try
{
listener = new TcpListener(port);
listener.Start();
mainSocket = listener.AcceptSocket();
s = new NetworkStream(mainSocket);
eventWatcher = new Thread(new ThreadStart(waitForKeys));
eventWatcher.Start();
while (true)
{
Bitmap screeny = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
Graphics theShot = Graphics.FromImage(screeny);
theShot.ScaleTransform(.25F, .25F);
theShot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
BinaryFormatter bFormat = new BinaryFormatter();
bFormat.Serialize(s, screeny);
Thread.Sleep(imageDelay);
theShot.Dispose();
screeny.Dispose();
}
}
catch (Exception)
{
if (mainSocket.IsBound)
mainSocket.Close();
if (listener != null)
listener.Stop();
}
}
private static void trigger(IAsyncResult i) { }
和客户端代码(同样,删除了很多):
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 256;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
public partial class Form2 : Form
{
private static string response;
private Stream stream;
private StreamWriter eventSender;
private Thread theThread;
private TcpClient client;
private Form1 mForm;
private int resolutionX;
private int resolutionY;
//private int sendDelay = 250;
//private Thread delayThread;
public bool sendKeysAndMouse = false;
private static ManualResetEvent sendDone = new ManualResetEvent(false);
private static ManualResetEvent receiveDone = new ManualResetEvent(false);
public Form2()
{
InitializeComponent();
}
public Form2(TcpClient s, Form1 callingForm)
{
client = s;
mForm = callingForm;
InitializeComponent();
theThread = new Thread(new ThreadStart(startRead));
theThread.Start();
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (theThread.IsAlive)
theThread.Abort();
mForm.form2Closed();
}
private void startRead()
{
try
{
stream = client.GetStream();
eventSender = new StreamWriter(stream);
while (true)
{
BinaryFormatter bFormat = new BinaryFormatter();
Bitmap inImage = bFormat.Deserialize(stream) as Bitmap;
resolutionX = inImage.Width;
resolutionY = inImage.Height;
theImage.Image = (Image)inImage;
}
}
catch (Exception) { }
/*try
{
Image theDesktop;
stream = client.GetStream();
theDesktop.Save(stream,new ImageFormat(
while (true)
{
while (stream.Read(buffer, 0, 1024) > 0)
theDesktop.Read(buffer, 0, 1024);
if(theDesktop != null) {
theDesktop.
theImage.Image = temp;
}
}
catch (Exception gay) { }*/
}
private void Form2_ResizeEnd(object sender, EventArgs e)
{
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void Form2_MouseMove(object sender, MouseEventArgs e)
{
}
private void theImage_MouseClick(object sender, MouseEventArgs e)
{
if (!sendKeysAndMouse)
return;
eventSender.Write("LCLICK\n");
eventSender.Flush();
}
private void theImage_MouseDown(object sender, MouseEventArgs e)
{
if (!sendKeysAndMouse)
return;
eventSender.Write("LDOWN\n");
eventSender.Flush();
}
private void theImage_MouseUp(object sender, MouseEventArgs e)
{
if (!sendKeysAndMouse)
return;
eventSender.Write("LUP\n");
eventSender.Flush();
}
private void Receive(Socket client)
{
try
{
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void Send(Socket client, String data)
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client);
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
else
{
if (state.sb.Length > 1)
{
response = state.sb.ToString();
}
receiveDone.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private void SendCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
int bytesSent = client.EndSend(ar);
Console.WriteLine("Sent {0} bytes to server.", bytesSent);
sendDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
我希望有人能帮助我,或者向我解释我做错了什么以及我如何才能让它发挥作用。
最佳答案
Team Viewer 执行此操作的方式是在交互中有第三台计算机。 Team Viewer 在 Internet 上有一个公共(public)服务器,您和您所连接的人都可以与之交谈,它所做的只是充当一座桥梁,将传入的消息从一端转发到另一端。现在两端都有出站连接,不需要端口转发。
要对您的系统执行相同的操作,您需要在互联网上设置、托管(付费)和维护一个公共(public)服务器,您的程序的所有用户都可以与之交谈并充当通信的桥梁。
步骤是这样的:
关于C# - 无需端口转发即可远程控制 PC(如 TeamViewer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25792683/
我在正在构建的应用程序中集成了转发系统,但很难弄清楚在同一流中检索帖子和转发的逻辑。 我有一个 post_reblog 数据透视表来存储 post_id 和 user_id - 转发该帖子的用户的 I
好的,由于阅读了数百本手册和说明页但仍然没有得到它,我正处于某个时刻,我觉得自己非常愚蠢。我希望你能帮帮我! 我有一台运行 Ubuntu Server 的服务器。在服务器上,我正在运行 ddclien
我在我的项目中使用嵌入 jetty 并提出了一些问题。我有这两页: íindex.jsp 结果.jsp 这两个 servlet: 上传 搜索 在 íindex.jsp 中有一个用于上传文件的表单,上传
我正在使用 c# asp.net 创建一个基于 Web 的电子邮件客户端。 令人困惑的是,各种电子邮件客户端在回复电子邮件时似乎以多种不同方式添加原文。 我想知道的是,是否有某种标准化的方式来消除这个
我正在开发一个评估系统,让考生尝试参加考试。因此,呈现问题及其选择的页面是带有 iframe 的页面,在该页面中呈现问题。包含 iframe 的页面包含 JavaScript 计时器。 因此,当问题在
QOTD(每日问题)的 Twilio 新手。我认为这应该是非常基本的,但我似乎找不到答案。 我成功地将一个电话号码转发到我的手机上……很简单……但问题是我经营着几家公司,我想将号码转发到我的手机上。问
我正在尝试在 pod 上公开一个端口 8080,这样我就可以直接从服务器获取 wget。使用端口转发一切正常(kubectl --namespace jenkins port-forward pods
我想转发一个 url,这样如果你在地址栏中输入 www.example.com,你就会被转发到 www.test.com/test.php。 我所做的是在我的区域文件中添加了一个 cname 记录。
我正在尝试在构建 docker 镜像时克隆一个私有(private) github 存储库。我安装了 docker 18.09.2 并根据 Build secrets and SSH forwardi
Grails 2.2.0 我正在探索grails和ajax,也许我是一个狂热的ajax适配器,但是我确实认为它是一个改变游戏规则的人,所以我要走在前面。 数据模型是主要细节(1:n)。客户端中的一个表
Tumblr API似乎不支持帖子的某些细节:评论、转发或点赞的数量。 真的没有办法从每个帖子的 Tumblr API 获取这个吗? 最佳答案 tumblr API 在报告笔记的方式上非常有限。它可以
我正在制作一个greasemonkey脚本,我想要一个链接来前进并修改当前的html并允许用户单击返回以转到原始页面。 我该怎么做?使用jquery+greasemonkey+javascript。主
我的包含文件有一个小问题,我已经对我的问题做了一个简化的模型。假设我正在编译一些需要名为的头文件的源代码 header.h 里面有: #ifndef HEADER_INCLUDED #define H
我遇到了一个奇怪的问题。我有一个自定义组件来为我处理 UICollectionView 的布局。该代码是用 Swift 编写的。 class MyCustomCollectionViewHandler
有什么方法可以导出命令输出的颜色吗? 让我们用一个小例子来解释它: ls -alh --color=auto 将打印目录的彩色内容,而 ls -alh --color=auto | cat 不会打印一
我希望能够转发 url,例如 http://external_url.com/auth => http://internal_url.com:8080/app/auth https://externa
我有一个在 nginx 中混合运行 PHP 和 Tomcat 的域。这是它的样子。我在这个站点上有一个域 example.com 我安装了 Wordpress。这完全没有问题。现在我想要的是,当您导航
我在一种模板化的层次结构中有一堆相关的指标,看起来像 template struct index{ index w; int x, y; }; template <> struct
我之前发布了有关使用Processing与Leap Motion的文章https://www.leapmotion.com/为了构建一个可以检测手颤的应用程序。我相信我需要执行 FFT 才能实现此目的
Peer 必须能够转发数据,以便在点对点覆盖(例如 Chord)中进行广播。当每个节点(对等体)接收到数据时,它会将数据转发到其路由表中的所有其他节点,然后这些节点将再次转发相同的数据,直到环中的所有
我是一名优秀的程序员,十分优秀!