C#網絡編程簡單實現通信小例子-2


1、主界面                                                         

2、源代碼                                                        

Client

public partial class FormClient : Form
    {
        //聲明一個Socket
        public Socket newClient;
        //判斷是否連接成功
        public bool isConnected;
        //定義一個線程
        public Thread myThread;
        //定義一個委托
        public delegate void MyInvoke(string str);
        public FormClient()
        {
            InitializeComponent();
        }

        private void Connection()
        {
            //IPAddress ip=null;
            //int port=888;
            byte[]data=new byte[1024];
            //創建一個新的Socket
            newClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //獲取IP地址
            #region GetIP
            //if (txtIP.Text == string.Empty)
            //{
            //    MessageBox.Show("遠程IP不能為空");
            //}
            //else
            //{
            //    string pattrn = @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))";
            //    if (System.Text.RegularExpressions.Regex.IsMatch(txtIP.Text.Trim(), pattrn))
            //    {
            //        ip = IPAddress.Parse(txtIP.Text.Trim());
            //    }
            //    else
            //    {
            //        MessageBox.Show("IP地址格式不正確!");
            //    }
            //} 
            
            #endregion
            //獲取端口號
            #region GetPort
            //if (System.Text.RegularExpressions.Regex.IsMatch(@"^[-]?\d+[.]?\d*$", txtPort.Text.Trim()))
            //{
            //    port = Convert.ToInt32(txtPort.Text.Trim());
            //}
            //else
            //{
            //    MessageBox.Show("端口號格式不正確");
            //} 
            #endregion
            //封裝網絡端點
            IPEndPoint ie = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),Convert.ToInt32(txtPort.Text.Trim()));
            #region Connection
            try
            {
                //建立與遠程主機之間的連接
                newClient.Connect(ie);
                //設置連接服務器控件的屬性
               // btnConnection.Enabled = false;
                //設置連接狀況
                btnConnection.Text = "停止連接";
                //isConnected = true;
            }
            catch (SocketException ex)
            {
                MessageBox.Show("連接服務器失敗" + ex.Message);
                return;
            } 
            #endregion
            //啟動當前線程用於接收消息
            ThreadStart myThreadDelegate = new ThreadStart(ReceiveMessage);
            myThread = new Thread(myThreadDelegate);
            myThread.Start();
        }
        /// <summary>
        /// 接收消息
        /// </summary>
        public void ReceiveMessage()
        {
            while (true)
            { 
                //定義字節數組大小
                byte[]data=new byte[1024];
                //獲取數組長度
                int recv = newClient.Receive(data);
                //接收數據
                string strData = Encoding.UTF8.GetString(data, 0, recv);
                //顯示信息
                ShowMessage(newClient.RemoteEndPoint.ToString()+":"+strData+"\r\n");
            }
        }
        /// <summary>
        /// 顯示消息
        /// </summary>
        /// <param name="msg">接收的消息,可能來自Client/也可能來自Server</param>
        public void ShowMessage(string msg)
        {
            //如果是在創建該控件以外的線程調用該控件
            if (lbMessage.InvokeRequired)
            {
                MyInvoke myInvoke = new MyInvoke(ShowMessage);
                //lbMessage.Invoke(myInvoke, new object[] { msg });
                lbMessage.Invoke(myInvoke,new object[]{"遠程主機:"+msg});
            }
            else
            {
                lbMessage.Items.Add(msg);
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (txtSendMessage.Text == null)
            {
                txtSendMessage.Text = "發送消息不能為空";
                //停留1秒消失
            }
            else
            {
                //獲取發送數據長度
                int myMessLength = txtSendMessage.Text.Length;
                //將數據轉換為字節數組
                byte[] data = new byte[myMessLength];
                data = Encoding.UTF8.GetBytes(txtSendMessage.Text);
                //發送數據
                int i = newClient.Send(data);
                //將數據顯示在Client
                ShowMessage("我說:" + txtSendMessage.Text + "\r\n");
            }
        }

        private void btnConnection_Click(object sender, EventArgs e)
        {
            if (btnConnection.Text == "連接服務")
            {
                Connection();
            }
            else
            {
                newClient.Close();
            }
        }

        private void FormClient_Load( object sender, EventArgs e )
        {

        }
        
    }

Server

 

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public Thread myThread;//聲明一個線程實例
        public Socket newSocket;//聲明一個Socket實例
        public Socket serverSocket;//聲明服務端Socket實例
        public Socket clientSocket;//聲明客戶端Socket
        public delegate void MyInvoke(string str);//聲明一個委托
        public IPEndPoint localEP;//聲明本地網絡端點
        public EndPoint remote;//聲明網絡地址
        public int localPort;//聲明本地端口號
        public Boolean isListening;//聲明服務端是否監聽
        public Hashtable _sessionTable;//用於記錄用戶信息
        public bool btnState=true;
        //設置服務端監聽的端口號屬性
        public int SetPort
        {
            get { return localPort; }
            set { localPort = value; }
        }
        //設置監聽
        public void Listening()
        {
            SetPort = int.Parse(txtPort.Text.Trim());//設置端口號
            newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化Socket實例
            newSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//允許Socket被綁定在已使用的地址上
            localEP = new IPEndPoint(IPAddress.Any, SetPort);//初始化網絡端點信息
            try
            {
                _sessionTable = new Hashtable( 50 );
                newSocket.Bind(localEP);//綁定端口
                newSocket.Listen(10);//開始監聽
                newSocket.BeginAccept(new AsyncCallback(OnConnectRequest),newSocket);//開始異步接受連接
            }
            catch(Exception ex)
            {
                ShowMessage(ex.ToString());
            }
            
        }
        private void btnStartServer_Click(object sender, EventArgs e)
        {
            ThreadStart myThreadDelegate = new ThreadStart(Listening);//新建一個線程用於委托
            myThread = new Thread(myThreadDelegate);
            if (btnState)
            {
                myThread.Start();
                stateBar.Text = "服務已經啟動,等待客戶端連接";
                btnState = false;
                btnStartServer.Text = "停止服務";
            }
            else
            {
                myThread.Interrupt();
                myThread.Abort();
                btnState = true;
                btnStartServer.Text = "開始服務";
                stateBar.Text = "服務已停止";
            }
        }
        //顯示信息
        public void ShowMessage(string msg)
        {
            if (rtbMessage.InvokeRequired)
            {
                MyInvoke myInvoke = new MyInvoke(ShowMessage);
                rtbMessage.Invoke(myInvoke, new object[] { msg });
            }
            else
            {
                rtbMessage.AppendText(msg);
            }
        }
        public void OnConnectRequest(IAsyncResult ar)
        {
            serverSocket = (Socket)ar.AsyncState;
            clientSocket = serverSocket.EndAccept(ar);//異步接收連接
            string welcomeStr = "歡迎登陸到服務器";
            byte[] data = System.Text.Encoding.UTF8.GetBytes(welcomeStr);
            remote = clientSocket.RemoteEndPoint;//獲取遠程終點信息
            ShowMessage(remote.ToString()+" 連接成功 "+DateTime.Now.ToString()+"\r\n");
            clientSocket.Send(data,data.Length,0);
            UserListOperate(clientSocket.RemoteEndPoint.ToString());
            _sessionTable.Add(clientSocket.RemoteEndPoint,null);//將連接成功的客戶端實例添加到哈希表中
            serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客戶端連接
            //接收數據
            ReceiveMessage();
        }
        //接收數據
        public void ReceiveMessage ()
        {
            while (true)
            { 
                byte[]data=new byte[1024];
                int recv = clientSocket.Receive( data );
                string message = Encoding.UTF8.GetString(data,0,recv);
                ShowMessage(clientSocket.RemoteEndPoint.ToString()+":"+message+"\r\n");
            }
        }
        //添加用戶列表
        public void UserListOperate(string msg)
        {
            //在線程里以安全的方式調用控件
            if (lbUserList.InvokeRequired)
            {
                MyInvoke myInvoke = new MyInvoke(UserListOperate);
                lblUserList.Invoke(myInvoke, new object[] { msg });
            }
            else
            {
                lbUserList.Items.Add(msg);
            }
        }
        //刪除用戶列表
        public void UserListOperateRemove(string msg)
        {
            if (lbUserList.InvokeRequired)
            {
                MyInvoke myInvoke = new MyInvoke(UserListOperateRemove);
                lbUserList.Invoke(myInvoke, new object[] { msg });
            }
            else
            {
                lbUserList.Items.Remove(msg);
            }
        }
        //發送廣播
        public void BroadCast()
        {
            string strMessage = txtMessage.Text;
            Byte[] data = Encoding.UTF8.GetBytes(strMessage);
            foreach (DictionaryEntry item in _sessionTable)
            {
                EndPoint temp = (EndPoint)item.Key;
                clientSocket.SendTo(data, temp);
                ShowMessage("我:"+strMessage+"\r\n");
            }
            txtMessage.Text = "";
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //獲取本機IP
            IPAddress[] ip = Dns.GetHostByName( Dns.GetHostName() ).AddressList;
            lblIP.Text+=ip[0].ToString();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //窗體關閉時判斷線程是否為空
            if (myThread != null)
            {
                myThread.Abort();
            }
            throw new Exception();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            BroadCast();
        }
    }

如有不當之處,煩請指教。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM