liu8359 发表于 2020-12-21 16:06

C#使用Socket局域网内推送消息学习

代码不是我的原创,东拼西凑的结合体,我只是敲了一边,学习学习。


当A电脑开启监听端口时,B电脑输入A电脑的IP和端口可以像B电脑发送消息。
当然AB电脑在统一局域网内。


代码太多放最后了,这是项目

socket接收消息

      public Form1()
      {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
            Color c = Color.FromArgb(255, 0, 0);
            this.pictureBox1.BackColor = c;
      }

      /// <summary>
      /// 开启监听
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void button1_Click(object sender, EventArgs e)
      {
            this.Listen(int.Parse(textBox_port.Text));//端口
            Color c = Color.FromArgb(0, 255, 0);
            this.pictureBox1.BackColor = c;
      }

      #region 接收Socket

      private static Encoding encode = Encoding.Default;

      /// <summary>
      /// 监听请求
      /// </summary>
      /// <param name="port">端口</param>
      public void Listen(int port)
      {
            Task.Run(() =>
            {
                try
                {
                  Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                  listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
                  listenSocket.Listen(100);
                  this.Logs_Info("开启监听" + port + "端口...");

                  while (true)
                  {
                        Socket acceptSocket = listenSocket.Accept();
                        string receiveData = Receive(acceptSocket, 5000);
                        if (receiveData == "1")//如果接收到的消息是1,窗口最小化
                            this.Minimized();
                        this.Logs_Info("Receive:" + receiveData);
                        acceptSocket.Send(encode.GetBytes("ok"));
                        DestroySocket(acceptSocket);
                  }
                }
                catch (Exception e)
                {
                  throw;
                }
            });
      }

      /// <summary>
      /// 窗口最小化
      /// </summary>
      private void Minimized()
      {
            Task.Run(() =>
            {
                this.WindowState = FormWindowState.Minimized;
            });
      }

      //输出文本框
      private void Logs_Info(string message)
      {
            try
            {
                if (textBox1.InvokeRequired)//跨线程了
                  textBox1.Invoke(new EventHandler(delegate
                  {
                        textBox1.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
                  }));
                else//同线程直接赋值
                  textBox1.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
            }
            catch { }
      }

      /// <summary>
      /// 接收数据
      /// </summary>
      /// <param name="socket"></param>
      /// <param name="timeout"></param>
      /// <returns></returns>
      private string Receive(Socket socket, int timeout)
      {
            string result = string.Empty;
            socket.ReceiveTimeout = timeout;
            List<byte> data = new List<byte>();
            byte[] buffer = new byte;
            int length = 0;
            try
            {
                while ((length = socket.Receive(buffer)) > 0)
                {
                  for (int j = 0; j < length; j++)
                  {
                        data.Add(buffer);
                  }
                  if (length < buffer.Length)
                  {
                        break;
                  }
                }
            }
            catch { }
            if (data.Count > 0)
            {
                result = encode.GetString(data.ToArray(), 0, data.Count);
            }
            return result;
      }

      /// <summary>
      /// 销毁Socket对象
      /// </summary>
      /// <param name="socket"></param>
      private void DestroySocket(Socket socket)
      {
            if (socket.Connected)
            {
                socket.Shutdown(SocketShutdown.Both);
            }
            socket.Close();
      }


socket发送消息

      public Form1()
      {
            InitializeComponent();
      }

      /// <summary>
      /// 发送按钮
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void button1_Click(object sender, EventArgs e)
      {
            string IP=this.textBox_IP.Text;//ip
            int port=int.Parse(this.textBox_端口.Text);//端口
            string news=this.textBox1.Text;//发送消息内容
            this.SendMessage(IP, port, news);
      }

      /// <summary>
      /// 字符编码处理.
      /// </summary>
      private Encoding ASCII;

      /// <summary>
      /// 发送
      /// </summary>
      /// <param name="IP"></param>
      /// <param name="port"></param>
      /// <param name="news"></param>
      public void SendMessage(string IP, int port, string news)
      {
            ASCII = Encoding.ASCII;
            // 构造用于发送的 字节缓冲.
            Byte[] sendBytes = ASCII.GetBytes(news);

            // 构造用于接收的 字节缓冲.
            Byte[] recvBytes = new Byte;

            // IP地址.
            IPAddress localAddr = IPAddress.Parse(IP);
            // 接入点.
            IPEndPoint ephost = new IPEndPoint(localAddr, port);

            // 第一个参数:AddressFamily = 指定 Socket 类的实例可以使用的寻址方案。
            //   Unspecified 未指定地址族。
            //   InterNetwork IP 版本 4 的地址。
            //   InterNetworkV6 IP 版本 6 的地址。
            //
            // 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型。
            //   Stream 一个套接字类型,支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
            //            此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。
            //            此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
            //
            // 第三个参数:ProtocolType = 指定 Socket 类支持的协议。
            //   Tcp 传输控制协议 (TCP)。
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                // 尝试连接主机.
                s.Connect(ephost);
                Logs_Info("向服务器发送到了:{0}".FormatWith(news));

                // 向主机发送数据.
                s.Send(sendBytes, sendBytes.Length, SocketFlags.None);
                // 接收服务器的应答.
                Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
                StringBuilder buff = new StringBuilder();
                while (bytes > 0)
                {
                  // 将缓冲的字节数组,装换为字符串.
                  String str = ASCII.GetString(recvBytes, 0, bytes);
                  // 加入字符串缓存
                  buff.Append(str);
                  // 再次接受,看看后面还有没有数据.
                  bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
                }
                Logs_Info("从服务器接收到了:{0}".FormatWith(buff.ToString()));
            }
            catch (Exception ex)
            {
                Logs_Info("连接/发送/接收过程中,发生了错误!");
                Logs_Info(ex.Message);
                Logs_Info(ex.StackTrace);
            }
            finally
            {
                s.Close();
            }
      }

      /// <summary>
      /// 输出消息
      /// </summary>
      /// <param name="message"></param>
      private void Logs_Info(string message)
      {
            try
            {
                if (textBox2.InvokeRequired)
                  textBox2.Invoke(new EventHandler(delegate
                  {
                        textBox2.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
                  }));
                else
                  textBox2.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
            }
            catch { }
      }

NvidiaChina 发表于 2020-12-21 16:14

挺有意思的,帮顶

linuxcool 发表于 2020-12-21 16:17

我以为,不用安装客户端都可以推送

liu8359 发表于 2020-12-21 16:19

linuxcool 发表于 2020-12-21 16:17
我以为,不用安装客户端都可以推送

那不就为所欲为了

那年夏天52 发表于 2020-12-21 16:27

linuxcool 发表于 2020-12-21 16:17
我以为,不用安装客户端都可以推送

要这么厉害就上天了

执手相看泪眼 发表于 2020-12-21 17:31

Java学员来看啦

shxinxian 发表于 2020-12-28 22:35

学习下,正在研究这方面的

lusir401 发表于 2021-1-5 08:17

有意思,这样的好贴必须顶起。

nullable 发表于 2021-1-15 16:14

liu8359 发表于 2020-12-21 16:19
那不就为所欲为了

对,其实有些人就是想为所欲为{:301_976:}

Ego52 发表于 2021-2-28 20:11

有时间学习下。。。感谢分享
页: [1] 2
查看完整版本: C#使用Socket局域网内推送消息学习