• c# socket thread 对 Windows 窗体控件的线程安全调用


    参考:

    http://msdn.microsoft.com/zh-cn/library/ms171728(VS.80).aspx

    Server 端:

    Form1.CS:

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

    namespace socketandthreadserver
    {
        public partial class Form1 : Form
        {
           public Thread mythread;

           public Socket socket;
            delegate void SetTextCallback(string text);

            public Form1()
            {
                InitializeComponent();
            }

            public static IPAddress GetServerIP()
            {

                //IPHostEntry ieh = Dns.GetHostByName(Dns.GetHostName());
                IPHostEntry ieh = Dns.GetHostEntry("127.0.0.1");
               

                return ieh.AddressList[0];

            }

            private void BeginListen()
            {

                IPAddress ServerIp = GetServerIP();

                IPEndPoint iep = new IPEndPoint(ServerIp, 8000);

                socket = new

                         Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                byte[] byteMessage = new byte[100];

                //this.label1.Text = iep.ToString();

                socket.Bind(iep);


                while (true)
                {

                    try
                    {

                        socket.Listen(5);

                        Socket newSocket = socket.Accept();

                        newSocket.Receive(byteMessage);

                        string sTime = DateTime.Now.ToShortTimeString();

                        string msg = sTime + ":" + "Message from:";

                        msg += newSocket.RemoteEndPoint.ToString() + Encoding.Default.GetString(byteMessage);

                        //this.listBox1.Items.Add(msg);
                        //this.SetText(msg);
                        this.SetListBox(msg);

                    }

                    catch (SocketException ex)
                    {

                        this.label1.Text += ex.ToString();

                    }

                }


            }

            private void button1_Click(object sender, EventArgs e)
            {
                try
                {

                    mythread = new Thread(new ThreadStart(BeginListen));

                    mythread.Start();

                }

                catch (System.Exception er)
                {

                    MessageBox.Show(er.Message, "完成", MessageBoxButtons.OK, MessageBoxIcon.Stop);

                }


            }

            private void SetListBox(string text)
            {
                if (this.listBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetListBox);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.listBox1.Items.Add(text);
               
                }

            }


            private void SetText(string text)
            {
                // InvokeRequired required compares the thread ID of the
                // calling thread to the thread ID of the creating thread.
                // If these threads are different, it returns true.
                if (this.textBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.textBox1.Text = text;
                }
            }


        }
    }

    Form1.Designer.cs:

    namespace socketandthreadserver
    {
        partial class Form1
        {
            /// <summary>
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary>
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                try
                {

                    socket.Close();//释放资源

                    mythread.Abort();//中止线程

                }

                catch { }


                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            #region Windows 窗体设计器生成的代码

            /// <summary>
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.label1 = new System.Windows.Forms.Label();
                this.button1 = new System.Windows.Forms.Button();
                this.listBox1 = new System.Windows.Forms.ListBox();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.SuspendLayout();
                //
                // label1
                //
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(12, 23);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(41, 12);
                this.label1.TabIndex = 0;
                this.label1.Text = "label1";
                //
                // button1
                //
                this.button1.Location = new System.Drawing.Point(14, 160);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 1;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                //
                // listBox1
                //
                this.listBox1.FormattingEnabled = true;
                this.listBox1.ItemHeight = 12;
                this.listBox1.Location = new System.Drawing.Point(102, 12);
                this.listBox1.Name = "listBox1";
                this.listBox1.Size = new System.Drawing.Size(261, 40);
                this.listBox1.TabIndex = 2;
                //
                // textBox1
                //
                this.textBox1.Location = new System.Drawing.Point(102, 67);
                this.textBox1.Multiline = true;
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(261, 116);
                this.textBox1.TabIndex = 3;
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(388, 266);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.listBox1);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.label1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();

            }

            #endregion

            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.ListBox listBox1;
            private System.Windows.Forms.TextBox textBox1;
        }
    }

    Program.cs:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;

    namespace socketandthreadserver
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

    Client:

    Form1.cs:

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

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

            private void button1_Click(object sender, EventArgs e)
            {
                BeginSend();      
            }

            private void BeginSend()
            {

                string ip = this.txtip.Text;

                string port = this.txtport.Text;

                IPAddress serverIp = IPAddress.Parse(ip);

                int serverPort = Convert.ToInt32(port);

                IPEndPoint iep = new IPEndPoint(serverIp, serverPort);

                byte[] byteMessage;


                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                socket.Connect(iep);

                byteMessage = Encoding.ASCII.GetBytes(textBox1.Text);

                socket.Send(byteMessage);

                socket.Shutdown(SocketShutdown.Both);

                socket.Close();

           
            }

        }
    }

    Form1.Designer.cs:

    namespace socketandthreadclient
    {
        partial class Form1
        {
            /// <summary>
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary>
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            #region Windows 窗体设计器生成的代码

            /// <summary>
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.txtip = new System.Windows.Forms.TextBox();
                this.txtport = new System.Windows.Forms.TextBox();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.button1 = new System.Windows.Forms.Button();
                this.SuspendLayout();
                //
                // txtip
                //
                this.txtip.Location = new System.Drawing.Point(12, 3);
                this.txtip.Name = "txtip";
                this.txtip.Size = new System.Drawing.Size(100, 21);
                this.txtip.TabIndex = 0;
                //
                // txtport
                //
                this.txtport.Location = new System.Drawing.Point(118, 3);
                this.txtport.Name = "txtport";
                this.txtport.Size = new System.Drawing.Size(100, 21);
                this.txtport.TabIndex = 1;
                //
                // textBox1
                //
                this.textBox1.Location = new System.Drawing.Point(12, 30);
                this.textBox1.Multiline = true;
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(268, 161);
                this.textBox1.TabIndex = 2;
                //
                // button1
                //
                this.button1.Location = new System.Drawing.Point(12, 206);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 3;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.txtport);
                this.Controls.Add(this.txtip);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();

            }

            #endregion

            private System.Windows.Forms.TextBox txtip;
            private System.Windows.Forms.TextBox txtport;
            private System.Windows.Forms.TextBox textBox1;
            private System.Windows.Forms.Button button1;
        }
    }

     Program.cs:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;

    namespace socketandthreadclient
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

  • 相关阅读:
    《PHP, MySQL, Javascript和CSS》读书随手记----php篇
    20160917 携程前端笔试题
    总结一下http请求吧
    前端资源池
    【CS】笔试常见题目
    【JavaScript】js 中一些需要注意的问题
    c++中的一些计算的问题
    ubuntu下sqlite命令
    关于ubuntu软件卸载的问题
    【js】关于正则表达式
  • 原文地址:https://www.cnblogs.com/BrianLee/p/2357681.html
Copyright © 2020-2023  润新知