代码之家  ›  专栏  ›  技术社区  ›  Anoop Mishra

使用NetComm dll向主机发送屏幕截图

  •  3
  • Anoop Mishra  · 技术社区  · 9 年前

    我正在使用NetComm dll来处理多用户。我的问题是,当我发送文本时,它工作正常,但当我截屏时,它不工作。 我的客户代码是

    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,我只能发送和接收字节射线格式的数据。

    NetComm dll为我提供了一种工具,可以通过使用客户端的id从客户端通信到另一个客户端。当服务器启动时,它等待客户端,一旦客户端连接,它就开始以abc1、abc2、abc3等方式为它们提供id。当abc1想要与abc3通信时,它只需输入abc3作为id,而不是IP,并发送消息,该消息应传递给abc3。 This is server

    This is client

    正如您所看到的,有两个客户端连接到服务器,它们都获得了jack1和jack2这样的id。现在,如果它们想要相互通信,只需键入各自的id并发送消息。

    2 回复  |  直到 9 年前
        1
  •  1
  •   ntohl    8 年前

    我尝试做一个简单的客户->客户端消息发送,将是位图。当我尝试将它与不同的端口一起使用时,我遇到了问题,但端口被阻塞,这就是问题所在。也检查一下。检查代码,看看是否有帮助:

    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();
            }
        }
    }
    
        2
  •  0
  •   ntohl    8 年前

    完整的服务器/客户端实现可能是这样的。您不需要实现两个不同的客户端程序,但客户端和服务器应该不同。这是一个如何使用广播的示例>

    程序.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]))));
            }
        }
    }
    

    表格1.cs

    public partial class Form1 : Form
    {
        public Form1(NetComm.Client client)
        {
            _client = client;
            InitializeComponent();
        }
    
        // there is a button to broadcast picture on the client.
        private void Button1_Click(object sender, EventArgs e)
        {
            // update the image that should be broadcasted as You like.
            _client.SendData(imageToByteArray(Image.FromFile("Bitmap1.bmp")));
        }
    
        NetComm.Client _client;
    
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Click += Button1_Click;
            _client.DataReceived += client_DataReceived;
        }
    
        void client_DataReceived(byte[] Data, string ID)
        {
            Stream stream = new MemoryStream(Data); // Data is byte array 
            pictureBox1.Image = Image.FromStream(stream);
        }
    
        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)
        {
            _client.Disconnect();
        }
    }
    

    客户端.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();
        }
    }
    

    主机.cs

    class Host: NetComm.Host
    {
        public Host(int port):base(port)
        {
            StartConnection();
            DataReceived += Host_DataReceived;
        }
    
        void Host_DataReceived(string ID, byte[] Data)
        {
            Brodcast(Data);
        }
    }