进程间通信

服务器端

进程间通信_第1张图片

 客户端1

进程间通信_第2张图片

 客户端2进程间通信_第3张图片

 注意客户端可以是多个客户端。

 对应代码

服务器端代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Services
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBox1.Text = getIpString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Listen(textBox1.Text, int.Parse(textBox2.Text));

        }

        private void Listen(string ipstr,int port)
        {
            //throw new NotImplementedException();
            Task.Run(() => 
            { 
                Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listenSocket.Bind(new IPEndPoint(IPAddress.Parse(ipstr), port));
                listenSocket.Listen(5);
                logStr($"开始监测ip: {ipstr}   端口: {port}");

                while (true)
                {
                    Socket acceptSocke = listenSocket.Accept();

                    string receiveDate = Receive(acceptSocke, 5000);
                    if(receiveDate == "1")
                        this.WindowState = FormWindowState.Minimized;
                    if (receiveDate == "2")
                        this.WindowState = FormWindowState.Maximized;

                    logStr($"接收到{receiveDate}");

                    acceptSocke.Send(Encoding.Default.GetBytes("ok"));

                    if (acceptSocke.Connected)
                    {
                        acceptSocke.Shutdown(SocketShutdown.Both);
                        acceptSocke.Close();
                    }

                }

            });
        
        }

        public string Receive(Socket socket, int timeOut)
        {
            //throw new NotImplementedException();
            string result = "";
            socket.ReceiveTimeout = timeOut;
            byte[] buffer = new byte[4096];
            int length = 0;
            try
            {
                length = socket.Receive(buffer);
                if (length > 0)
                {
                    //result = Encoding.Default.GetString(buffer, 0, length);
                    result = Encoding.UTF8.GetString(buffer, 0, length);
                }
            }
            catch (Exception ex)
            {

            }
            return result;
            
        }

        //public void logStr(string str)
        //{
        //    richTextBox1.AppendText(DateTime.Now.ToString() + " " + str + "\r\n");
        //}

        #region 消息展示
        private delegate void dlgShowMsg(string str);
        private void logStr(string str)
        {
            if (richTextBox1.InvokeRequired)
            {
                dlgShowMsg dlg = new dlgShowMsg(logStr);
                richTextBox1.Invoke(dlg, str);
            }
            else
            {
                if (richTextBox1.Lines.Length >= 1000)
                    richTextBox1.Clear();
                richTextBox1.AppendText(DateTime.Now.ToString("yyyyMMdd HH:mm:ss:fff") + "->" + str + "\r\n");
            }
        }
        #endregion


        public string getIpString()
        {
            string s = string.Empty;
            System.Net.IPAddress[] addressList = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList;
            //for( int i = 0; i < addressList.Length; i++ ) { 
            //    s += addressList[i].ToString();
            //}
            s= addressList[addressList.Length-1].ToString();
            return s;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

客户端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Clinet
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            textBox1.Text = getIpString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ip = textBox1.Text;
            int port = int.Parse(textBox2.Text);
            string news = textBox3.Text;

            SendMessage(ip,port, news);
        }

        private void SendMessage(string ip, int port, string news)
        {
            //throw new NotImplementedException();
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ephost = new IPEndPoint(IPAddress.Parse(ip), port);

            byte[] sendBytes = ASCIIEncoding.UTF8.GetBytes(news);

            byte[] recvBytes = new byte[256];
            string str = string.Empty;
            try
            {
                s.Connect(ephost);

                s.Send(sendBytes);
                logStr($"向服务器发送了{news}");

                int byteCount = s.Receive(recvBytes, recvBytes.Length,SocketFlags.None);
                if( byteCount > 0 )
                {
                    //str = Encoding.UTF8.GetString( recvBytes, 0, byteCount );
                    str = ASCIIEncoding.Default.GetString( recvBytes );
                }
                logStr($"从服务器接收到{str}");
                //logStr($"");
            }
            catch 
            {
            }

        }
        #region 消息展示
        //private delegate void dlgShowMsg(string str);
        
        private void logStr(string str)
        {
            if (richTextBox1.InvokeRequired)
            {
                //dlgShowMsg dlg = new dlgShowMsg(logStr);
                Action dlg = new Action(logStr);
                richTextBox1.Invoke(dlg, str);
            }
            else
            {
                if (richTextBox1.Lines.Length >= 1000)
                    richTextBox1.Clear();
                richTextBox1.AppendText(DateTime.Now.ToString("yyyyMMdd HH:mm:ss:fff") + "->" + str + "\r\n");
            }
        }
        #endregion
        public string getIpString()
        {
            string s = string.Empty;
            System.Net.IPAddress[] addressList = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList;
            //for( int i = 0; i < addressList.Length; i++ ) { 
            //    s += addressList[i].ToString();
            //}
            s = addressList[addressList.Length - 1].ToString();
            return s;
        }
    }
}

此程序可以用于单台程序间通信,也可以用于不同电脑之间的通信。

讲解参考 关老师 链接

C#MES系统任意两个客户端间通讯(套接字详解)_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1jo4y1t7bM/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click

特此记录

anlog

2024年1月2日

你可能感兴趣的:(笔记,进程间通信)