Socket通讯

一、

创建Windows 窗体应用(.NET Framework)项目

1.将窗体 StartPosition 设置为 CenterScreen

2.Test设置为:基于Scoket实现TCP服务器

后台代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += FrmTCPServer_Load;
        }

        private void FrmTCPServer_Load(object sender, EventArgs e)
        {
            this.lst_Rcv.Columns[1].Width = this.lst_Rcv.ClientSize.Width - this.lst_Rcv.Columns[0].Width;
        }

        /*

        服务器端程序的编写步骤:
        第一步:调用socket()函数创建一个用于通信的套接字
        第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind()函数来实现
        第三步:调用listen()函数使用套接字成为一个监听套接字。
        第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。
        第五步:处理客户端的连接请求。
        第六步:终止连接

        */

        //声明一个Socket对象
        private Socket soketServer;

        /// <summary>
        /// 开启服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_StartService_Click(object sender, EventArgs e)
        {
            //第一步:调用socket()函数创建一个用于通信的套接字
            soketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind()函数来实现
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(this.txt_IP.Text), int.Parse(this.txt_Port.Text));
            try
            {
                soketServer.Bind(ipe);
            }
            catch (Exception ex)
            {
                //写入日志
                AddLog(2, "服务器开启失败 "+ex.Message);
                return;
            }

            //第三步:调用listen()函数使用套接字成为一个监听套接字。
            soketServer.Listen(10);

            //创建一个监听多线程
            Task.Run(new Action(() =>
            {
                CheckListening();
            }));
            AddLog(0, "服务器开启成功");

            this.btn_StartService.Enabled = false;
        }
        /// <summary>
        /// 检查监听的线程方法体
        /// </summary>
        private void CheckListening()
        {
            while (true)
            {
                //第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。
                Socket socketCient = soketServer.Accept();
                Task.Run(new Action(() =>
                {
                    ReciveMessge(socketCient);
                }));
            }
        }

        /// <summary>
        /// 接受客户端数据的方法
        /// </summary>
        /// <param name="socketCient"></param>
        private void ReciveMessge(Socket socketCient)
        {
            while (true)
            {
                //创建一个缓冲区
                byte[] buffer = new byte[1024 * 1024 * 10];

                int length = -1;
                //第五步:处理客户端的连接请求。

                length = socketCient.Receive(buffer);
            }
        }

        #region 接受信息的方法

        //当前时间属性
        private string CurrentTime
        {
            get { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); }
        }

        //记录日志
        private void AddLog(int index,string info)
        {
            if (!this.lst_Rcv.InvokeRequired)
            {
                ListViewItem lst = new ListViewItem("  " + CurrentTime, "");

                lst.SubItems.Add(info);

                lst_Rcv.Items.Insert(0, lst);
            }
            else
            {
                Invoke(new Action(()=> {
                    ListViewItem lst = new ListViewItem("  " + CurrentTime, "");

                    lst.SubItems.Add(info);

                    lst_Rcv.Items.Insert(0, lst);
                }));
            }
        }
        #endregion
    }
作者:chenze
出处:https://www.cnblogs.com/chenze-Index/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
原文地址:https://www.cnblogs.com/chenze-Index/p/13991516.html