天天看點

黑馬程式員—網絡程式設計筆記

---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------

服務端與用戶端之間的通信:

服務端:

1.       啟動監聽

        a.       建立監聽套接字

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

           //使用ipv4尋址,使用流式套接字,使用Tcp協定

        b.       擷取網絡節點

           IPAddress address = IPAddress.Parse(txtIP.Text.Trim());

          EndPoint endPoint = new IPEndPoint(IPAddress, port);

       c.       監聽套接字綁定到網絡節點上

         sokWatch.Bind(endPoint);

      d.       啟動監聽服務

      sokWatch.Listen();

      e.       建立并開啟監聽線程

      threadWatch = new Thread(StartWatch);

      threadWatch.Start();

2.       負責監聽用戶端連接配接請求 (void StartWatch())

         while (isWatch)

            {

                 //監聽到用戶端連接配接請求,會傳回一個負責與該用戶端通信的新的套接字對象。否則在此阻斷線程。

                sokConnection = sokWatch.Accept();

                //獲得通信套接字的遠端 ip:port

                string strRemoteEndPoint =sokConnection.RemoteEndPoint.ToString();

                //将用戶端的ip:port 加入到listBox控件中

                lbClients.Items.Add(strRemoteEndPoint);

                //建立 通信管理類對象

                SocketConnection connection = new SocketConnection(sokConnection, ShowMsg);

                //将通信管理類對象 添加到集合中

                dictConnection.Add(strRemoteEndPoint, connection);

                //立即向 用戶端套接字發送一個消息資料

                sokConnection.Send(System.Text.Encoding.Default.GetBytes("Hello~~!"));

            }

3.       向指定用戶端發送消息

                tring key = lbClients.Text; //得到listbox中標明的項(用戶端Ip端口)

               if (!string.IsNullOrEmpty(key))

            {

                //獲得要發送的内容

                string strMsg = txtSend.Text.Trim();

                //通過集合中的鍵,找到對應通信套接字,來發送資料給對應的用戶端

                dictConnection[key].SendMsg(strMsg);

            }

            else

            {

                MessageBox.Show("請選擇要發送的用戶端.........");

            }

4.       群發消息

    //獲得要發送的内容

     string strMsg = txtSend.Text.Trim();

   //循環泛型集合中的值

    foreach (SocketConnection value in dictConnection.Values)

    {

                   value.SendMsg(strMsg);

    }

5.       向指定用戶端發送檔案

        a.       選擇檔案(打開對話框)

        b.       讀取檔案資料

        c.       發送資料

      using (FileStream fs = new FileStream(filePath, FileMode.Open))

                {

                    //準備一個檔案緩沖區

                    byte[] arrFile = new byte[1024 * 1024 * 2];

                    //讀取檔案資料,獲得真實檔案長度

                    int length = fs.Read(arrFile, 0, arrFile.Length);

                    //建立一個比讀取的檔案長度多1位的新數組

                    byte[] arrFileNew = new byte[length + 1];

                    arrFileNew[0] = 1;//設定辨別位為1,代表發送的是檔案資料

                    //将老數組的資料追加到新數組裡

                    Buffer.BlockCopy(arrFile, 0, arrFileNew, 1, length);

                    sokConnection.Send(arrFileNew);

                    dgShowMsg("發送檔案成功!”);

                }

6.       向指定用戶端發送閃屏消息

      public void SendShack()

        {

            //準備一個緩沖區

            byte[] arrFile = new byte[1];

            arrFile[0] = 3;

            sokConnection.Send(arrFile);

            dgShowMsg("向" + sokConnection.RemoteEndPoint.ToString() + "發送閃屏成功!”);

        }

用戶端:

1.        向服務端 發送連接配接請求

2.       循環接收服務端發來的資料

3.       顯示消息到文本框

4.       向伺服器發送消息

5.       閃屏

向服務端 發送連接配接請求:

sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //執行個體化套接字

IPAddress addreass = IPAddress.Parse(txtIP.Text.Trim());

IPEndPoint endpoint = new IPEndPoint(addreass, int.Parse(txtPort.Text.Trim()));

//向指定的 ip端口發送連接配接請求

sokClient.Connect(endpoint);

循環接收服務端發來的資料

while (isRecMsg)

            {

                byte[] msgRec = new byte[1024 * 1024 * 2];

                int recLength = sokClient.Receive(msgRec);

                switch(msgRec[0])

                {

                    case 1://接收到檔案

                        SaveFileDialog sfd = new SaveFileDialog();

                        if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

                        {

                            using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))

                            {

                                fs.Write(msgRec, 1, recLength - 1);

                            }

                            ShowMsg("檔案儲存完畢" + sfd.FileName);

                        }

                        break;

                    case 2://接收到字元串資訊

                        {

                             //轉換為字元串

                            string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);

                            //将接收到的資料顯示在文本框中

                            ShowMsg(strRec);

                            break;

                        }

                    case 3://接收到閃屏指令

                        {

                            ShakeWindow();

                            break;

                        }

                }

           }

顯示消息到文本框:

void ShowMsg(string msg)

        {

            txtMsg.AppendText(msg + "\r\n");

        }

閃屏:

private void ShakeWindow()

        {

            Random ran = new Random();

            //儲存窗體原坐标

            System.Drawing.Point point = this.Location;

            for (int i = 0; i < 30; i++)

            {

                //随機坐标

                this.Location = new System.Drawing.Point(point.X + ran.Next(8), point.Y + ran.Next(8));

                System.Threading.Thread.Sleep(15);//暫停15毫秒

                this.Location = point;//還原原坐标

                System.Threading.Thread.Sleep(15);//暫停15毫秒

            }

        }

---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------