C# 使用NetComm dll向主机发送屏幕截图
我正在使用NetComm dll处理多用户。我的问题是,当我发送文本时,它工作正常,但当我截图时,它不工作。 我的客户代码是C# 使用NetComm dll向主机发送屏幕截图,c#,.net,sockets,client-server,C#,.net,Sockets,Client Server,我正在使用NetComm dll处理多用户。我的问题是,当我发送文本时,它工作正常,但当我截图时,它不工作。 我的客户代码是 ms = new MemoryStream(); bmpScreenshot.Save(ms, ImageFormat.Png); byte[] buffer; buffer =imageToByteArray(bmpScreenshot); client.SendData(
ms = new MemoryStream();
bmpScreenshot.Save(ms, ImageFormat.Png);
byte[] buffer;
buffer =imageToByteArray(bmpScreenshot);
client.SendData(buffer);
将图像转换为字节数组的函数是:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
在接收端,我是这样处理的:
Stream stream = new MemoryStream(Data); // Data is byte array
pictureBox1.Image = Image.FromStream(stream);
pictureBox1.Refresh();
收到后,我在图片框中显示图像
使用NetComm dll,我只能以bytearray格式发送和接收数据
NetComm dll为我提供了通过使用其id从一个客户端到另一个客户端进行通信的功能。当服务器启动时,它会等待客户端,一旦客户端连接,它就会开始以某种方式(如abc1、abc2、abc3)为它们提供id。当abc1想要与abc3通信时,它只需输入abc3作为id,而不是IP,并发送消息,消息应发送给abc3。
正如您所看到的,有两个客户端连接到服务器,并且都获得类似jack1和jack2的id。现在,如果他们想彼此通信,只需在那里键入各自的ID并发送消息。我尝试了一个简单的客户端->客户端消息发送,这将是一个位图。当我尝试使用不同的端口时,我遇到了问题,但是端口被阻塞,这就是问题所在。也检查一下。检查代码,看看是否有帮助:
namespace CommTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
NetComm.Host host = new NetComm.Host(10010);
NetComm.Client client1 = new NetComm.Client();
NetComm.Client client2 = new NetComm.Client();
private void Form1_Load(object sender, EventArgs e)
{
host.StartConnection();
client1.Connect("localhost", 10010, "Jack");
client2.Connect("localhost", 10010, "Jack2");
client2.DataReceived += client2_DataReceived;
client1.SendData(imageToByteArray(Image.FromFile("Bitmap1.bmp")), "Jack2");
}
void client2_DataReceived(byte[] Data, string ID)
{
Stream stream = new MemoryStream(Data); // Data is byte array
pictureBox1.Image = Image.FromStream(stream);
// pictureBox1.Refresh(); works without it
}
public byte[] imageToByteArray(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, ImageFormat.Gif);
return ms.ToArray();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
host.CloseConnection();
}
}
}
完整的服务器/客户端实现可能是这样的。您不需要实现两个不同的客户端程序,但客户端和服务器应该是不同的。这是一个如何使用广播的示例> Program.cs
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] argv)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// if You run the program like "CommTest.exe 10010", than it will be host.
// if You run it like "CommTest.exe localhost 10010", than it will be client connecting to localhost.
if (argv.Length == 1)
{
Application.Run(new Form2(new Host(int.Parse(argv[0]))));
}
else
{
Application.Run(new Form1(new Client(argv[0], int.Parse(argv[1]))));
}
}
}
Client.cs
class Client: NetComm.Client
{
public Client(string ip, int port):base()
{
// in this example, the ids are not considered. In a real world situation Clients should send a first message to the host,
// and host should reply with a free id. That id should be in the place of Guid.NewGuid().ToString()
Connect(ip, port, Guid.NewGuid().ToString());
}
}
表格2.cs
public partial class Form2 : Form
{
public Form2(NetComm.Host host)
{
_host = host;
InitializeComponent();
}
NetComm.Host _host;
private void Form2_Load(object sender, EventArgs e)
{
button1.Click += Button1_Click;
}
// there is a button to close the connection on the host form.
private void Button1_Click(object sender, EventArgs e)
{
_host.CloseConnection();
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
_host.CloseConnection();
}
}
Host.cs
class Host: NetComm.Host
{
public Host(int port):base(port)
{
StartConnection();
DataReceived += Host_DataReceived;
}
void Host_DataReceived(string ID, byte[] Data)
{
Brodcast(Data);
}
}
或者任何关于客户间沟通的建议,我的意思是当一个客户想要向其他客户发送个人信息时,我尝试了什么方法?在什么意义上它不起作用?这个问题缺乏太多细节。。。您确实需要提供更多信息,例如您如何使用NetComm的详细信息,以便我们重现问题。我想使用具有多个客户端的tcp服务器,所有客户端都可以通过提供客户端id相互通信。可能有其他方法来实现这一点,或者我做错了。因为当我从一个客户端发送图片时,我希望它会出现在任何其他客户端上,但不会发生。在文本的情况下,它可以正常工作。而且我不能从服务器实现两个客户端。我的意思是我必须写两个不同的客户端程序。请给我解释一下。
class Host: NetComm.Host
{
public Host(int port):base(port)
{
StartConnection();
DataReceived += Host_DataReceived;
}
void Host_DataReceived(string ID, byte[] Data)
{
Brodcast(Data);
}
}