Beispiel #1
0
        // 傳送訊息
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            if (txtMessage.Text.Length == 0)
            {
                return;
            }

            if (receiveFlag)
            {
                MessageMod mod = new MessageMod();
                mod.MsgType       = (int)Common.PubClass.MsgType.Client2Client;
                mod.FromUser      = localName;
                mod.FromUser_Name = userName;
                mod.ToUser        = "";
                mod.Content       = this.txtMessage.Text;
                socketClient.Send(mod.ToBytes());
                txtReceived.AppendTxt(string.Format("{0}:{1}", mod.FromUser_Name, mod.Content));
                this.txtMessage.Clear();
                this.txtMessage.Focus();
                SendKeys.Send("{BACKSPACE}");
            }
            else
            {
                MessageBox.Show("伺服器停止回應");
            }
        }
Beispiel #2
0
        //傳送檔案
        private void btnSendFile_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtFilePath.Text    = openFileDialog.FileName;
                this.txtFilePath.Enabled = false;
            }

            string fileName = txtFilePath.Text;

            if (string.IsNullOrEmpty(fileName))
            {
                MessageBox.Show("請選擇檔案");
                return;
            }

            //將檔案打包成mod
            MessageMod mod = new MessageMod();

            using (FileStream fs = new FileStream(fileName, FileMode.Open)) {
                byte[] byts = new byte[fs.Length];
                fs.Read(byts, 0, (int)byts.Length);
                mod.ContentBytes = byts;
                //mod.ContentBytes = File.ReadAllBytes(fileName);
                fs.Close();
            }
            mod.MsgType       = (int)Common.PubClass.MsgType.Client2ClientFile;
            mod.FromUser      = localName;
            mod.FromUser_Name = userName;
            mod.ToUser        = "";
            mod.Content       = fileName;
            socketClient.Send(mod.ToBytes(), 0, mod.ToBytes().Length, SocketFlags.None); //傳送出去
            txtFilePath.Text = "";
        }
Beispiel #3
0
        //傳送檔案
        private void btnSendFile_Click(object sender, EventArgs e)
        {
            string SelectFriend = GetSelectClient();

            if (SelectFriend.Length == 0)
            {
                return;
            }
            string fileName = txtFilePath.Text;

            if (string.IsNullOrEmpty(fileName))
            {
                MessageBox.Show("請選擇檔案");
                return;
            }

            //將檔案打包成mod
            MessageMod mod = new MessageMod();

            using (FileStream fs = new FileStream(fileName, FileMode.Open)) {
                byte [] byts = new byte [1024 * 1024 * 2];
                fs.Read(byts, 0, (int)fs.Length);
                mod.ContentBytes = byts;
            }
            mod.MsgType  = (int)Common.PubClass.MsgType.Client2ClientFile;
            mod.FromUser = localName;
            mod.ToUser   = SelectFriend;
            mod.Content  = fileName;
            socketClient.Send(mod.ToBytes()); //傳送出去
        }
Beispiel #4
0
        // 傳送訊息
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            string SelectFriend = GetSelectClient();

            if (SelectFriend.Length == 0)
            {
                return;
            }
            if (txtMessage.Text.Length == 0)
            {
                return;
            }

            if (receiveFlag)
            {
                MessageMod mod = new MessageMod();
                mod.MsgType  = (int)Common.PubClass.MsgType.Client2Client;
                mod.FromUser = localName;
                mod.ToUser   = SelectFriend;
                mod.Content  = this.txtMessage.Text;
                socketClient.Send(mod.ToBytes());
                txtReceived.AppendTxt(string.Format("{0}:{1}", mod.FromUser, mod.Content));
                this.txtMessage.Text = "";
            }
            else
            {
                MessageBox.Show("伺服器停止回應");
            }
        }
Beispiel #5
0
        private void SendFrientToAll()
        {
            if (dictClients.Count < 1)
            {
                return;
            }
            string clients = "";

            foreach (KeyValuePair <string, Socket> item in dictClients)
            {
                clients += "^" + item.Key; //^IP:port
                //Debug.Print(clients);
            }
            clients = clients.Substring(1);

            //處理訊息,建立每個訊息的詳細資訊
            MessageMod mod = new MessageMod();

            mod.MsgType      = (int)Common.PubClass.MsgType.RadioClients;
            mod.FromUser     = socketServer.LocalEndPoint.ToString();
            mod.ToUser       = "******";
            mod.Content      = clients;
            mod.ContentBytes = new byte[1];
            foreach (var item in dictClients)
            {
                item.Value.Send(mod.ToBytes()); //Value = socket
            }
        }
Beispiel #6
0
        private void Server2ClientMsg(string toUser, string msg, bool isAll, Common.PubClass.MsgType type = Common.PubClass.MsgType.Server2ClientMsg)
        {
            //處理訊息,建立每個訊息的詳細資訊
            MessageMod mod = new MessageMod();

            mod.MsgType      = (int)type;
            mod.FromUser     = socketServer.LocalEndPoint.ToString();
            mod.ToUser       = toUser;
            mod.Content      = msg;
            mod.ContentBytes = new byte[1];
            byte[] bytes = mod.ToBytes();
            txtServerState.AppendTxt("【" + txtSerName.Text + "】" + " 對 " + "【" + mod.ToUser + "】" + " 說:" + msg);

            foreach (KeyValuePair <string, Socket> item in dictClients)
            {
                if (isAll) //全體
                {
                    item.Value.Send(bytes);
                }
                else if (item.Key == toUser)
                {
                    item.Value.Send(bytes);
                }
            }
        }
Beispiel #7
0
        // 監聽接收訊息的線程
        private void ReceiveMsg(Socket socketConn)
        {
            try
            {
                while (true)
                {
                    byte[] bytes = new byte[1024 * 1024 * 2];
                    socketConn.Receive(bytes); //從已連接的Socket接收資料至接收緩衝區中
                    string     receiveMsg   = Encoding.UTF8.GetString(bytes);
                    MessageMod mod          = new MessageMod(receiveMsg);
                    string     FromUserPort = mod.FromUser.Split(':')[1];
                    mod.ToUser = user_dic[FromUserPort];

                    switch (mod.MsgType)
                    {
                    case (int)Common.PubClass.MsgType.Client2Client:
                        this.txtServerState.AppendTxt(string.Format("【{0}】 對 【{1}】 說:{2}", mod.FromUser, mod.ToUser, mod.Content));

                        foreach (var item in dictClients)
                        {
                            if (item.Key == mod.ToUser)
                            {
                                item.Value.Send(bytes);
                            }
                        }
                        break;

                    case (int)Common.PubClass.MsgType.Client2ClientFile:
                        txtServerState.AppendTxt(string.Format("【{0}】 對 【{1}】 傳送了一個檔案:【{2}】", mod.FromUser, mod.ToUser, mod.Content));
                        SendFile(mod, false);
                        txtServerState.AppendTxt("傳送完成, 檔案大小:" + mod.ContentBytes.Length.ToString() + "kb");
                        break;

                    case (int)Common.PubClass.MsgType.ShineScreen:     //叮咚
                        txtServerState.AppendTxt(string.Format("【{0}】 對 【{1}】傳送了一個叮咚", mod.FromUser, mod.ToUser));
                        Server2ClientMsg(mod.ToUser, mod.Content, false, PubClass.MsgType.ShineScreen);
                        break;
                    }
                }
            }
            catch
            {
                string connName     = socketConn.RemoteEndPoint.ToString();
                string connNamePort = ((IPEndPoint)socketConn.RemoteEndPoint).Port.ToString();
                this.txtLog.AppendTxt(connName + " 已離線");

                if (user_dic.ContainsKey(connNamePort))
                {
                    Server2ClientMsg(user_dic[connNamePort], "對方已離線", false, Common.PubClass.MsgType.Offline);
                    user_dic.Remove(user_dic[connNamePort].Split(':')[1]); //從user_dic中移除
                    user_dic.Remove(connNamePort);
                }

                txtNowCount.Text = (int.Parse(txtNowCount.Text) - 1).ToString();
                dictClients.Remove(connName); //從dictClients中移除socket
                this.lstClient.Items.Remove(connName);
            }
        }
Beispiel #8
0
 private void SendFile(MessageMod mod, bool isAll)
 {
     byte[] byts = mod.ToBytes();
     foreach (KeyValuePair <string, Socket> item in dictClients)
     {
         if (isAll)
         {
             item.Value.Send(byts);
         }
         else if (item.Key == mod.ToUser)
         {
             item.Value.Send(byts);
         }
     }
 }
Beispiel #9
0
        //叮咚
        private void btnShake_Click(object sender, EventArgs e)
        {
            string SelectFriend = GetSelectClient();

            if (SelectFriend.Length == 0)
            {
                return;
            }
            MessageMod mod = new MessageMod();

            mod.MsgType  = (int)Common.PubClass.MsgType.ShineScreen;
            mod.FromUser = localName;
            mod.ToUser   = SelectFriend;
            mod.Content  = "叮咚!有人在家嗎~~";
            socketClient.Send(mod.ToBytes());
        }
Beispiel #10
0
        //叮咚
        private void btnShake_Click(object sender, EventArgs e)
        {
            MessageMod mod = new MessageMod();

            mod.MsgType       = (int)Common.PubClass.MsgType.ShineScreen;
            mod.FromUser      = localName;
            mod.FromUser_Name = userName;
            mod.ToUser        = "";
            mod.Content       = "叮咚!有人在家嗎~~";
            socketClient.Send(mod.ToBytes());

            this.txtReceived.SelectionFont  = new Font("微軟正黑體", 14, FontStyle.Bold);
            this.txtReceived.SelectionColor = Color.Red;
            this.txtReceived.AppendTxt("叮咚!有人在家嗎~~");
            this.txtReceived.SelectionFont  = new Font("微軟正黑體", 12, FontStyle.Regular);
            this.txtReceived.SelectionColor = Color.Black;
        }
Beispiel #11
0
        // 永久監聽線程

        private void ReceiveMsg()
        {
            try {
                while (receiveFlag)
                {
                    byte [] bytes = new byte [1024 * 1024 * 2];
                    socketClient.Receive(bytes);
                    string receiveMsg = Encoding.UTF8.GetString(bytes);
                    Debug.Print(receiveMsg);
                    MessageMod mod = new MessageMod(receiveMsg);
                    switch (mod.MsgType)
                    {
                    //一般傳訊息
                    case (int)Common.PubClass.MsgType.Client2Client:
                        this.txtReceived.AppendTxt(string.Format("{0}:{1}", mod.FromUser_Name, mod.Content));
                        break;

                    // 踢人
                    case (int)Common.PubClass.MsgType.TR:
                        this.txtReceived.AppendTxt(mod.Content);
                        socketClient.Close();
                        receiveFlag = false;
                        System.Timers.Timer tim = new System.Timers.Timer(3000);
                        tim.Enabled  = true;
                        tim.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => { this.Close(); };
                        break;

                    //伺服器關閉
                    case (int)Common.PubClass.MsgType.ServerClosed:
                        socketClient.Close();
                        this.txtReceived.AppendTxt("伺服器連線失敗,3秒後即將關閉視窗...");
                        System.Timers.Timer timer = new System.Timers.Timer(3000);
                        timer.Enabled  = true;
                        timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => { this.Close(); };
                        break;

                    //禁言
                    case (int)Common.PubClass.MsgType.JY:
                        this.txtReceived.AppendTxt(mod.Content);
                        this.btnSendMsg.Enabled   = false;
                        this.txtMessage.Enabled   = false;
                        this.txtMessage.BackColor = Color.Red;
                        break;

                    // 解禁言
                    case (int)Common.PubClass.MsgType.CancelJY:
                        this.txtReceived.AppendTxt(mod.Content);
                        this.btnSendMsg.Enabled   = true;
                        this.txtMessage.Enabled   = true;
                        this.txtMessage.BackColor = Color.White;
                        break;

                    //接收檔案
                    case (int)Common.PubClass.MsgType.Client2ClientFile:
                        if (MessageBox.Show("是否接收?", mod.FromUser + "傳送的檔案", MessageBoxButtons.YesNoCancel)
                            == System.Windows.Forms.DialogResult.Yes)
                        {
                            if (sfgDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                            {
                                using (FileStream fs = new FileStream(sfgDialog.FileName, FileMode.Create)) {
                                    fs.Write(mod.ContentBytes, 0, mod.ContentBytes.Length);
                                    txtReceived.AppendTxt("接收了一個檔案" + sfgDialog.FileName);
                                }
                            }
                            else
                            {
                                txtReceived.AppendTxt("取消接收文件" + sfgDialog.FileName);
                            }
                        }
                        break;

                    //叮咚
                    case (int)Common.PubClass.MsgType.ShineScreen:
                        this.txtReceived.SelectionFont  = new Font("微軟正黑體", 14, FontStyle.Bold);
                        this.txtReceived.SelectionColor = Color.Red;
                        this.txtReceived.AppendTxt("叮咚!有人在家嗎~~");
                        this.txtReceived.SelectionFont  = new Font("微軟正黑體", 12, FontStyle.Regular);
                        this.txtReceived.SelectionColor = Color.Black;
                        ShakeWindow();
                        break;

                    //管理員 to 用戶
                    case (int)Common.PubClass.MsgType.Server2ClientMsg:
                        this.txtReceived.AppendTxt(string.Format("管理員:{0}", mod.Content));
                        break;

                    //配對
                    case (int)Common.PubClass.MsgType.Check:
                        this.txtReceived.AppendTxt(mod.Content);
                        this.txtMessage.Enabled  = true;
                        this.btnShake.Enabled    = true;
                        this.btnSendMsg.Enabled  = true;
                        this.btnSendFile.Enabled = true;
                        break;

                    //對方離線
                    case (int)Common.PubClass.MsgType.Offline:
                        this.txtReceived.SelectionFont = new Font("微軟正黑體", 12, FontStyle.Bold);
                        this.txtReceived.AppendTxt(mod.Content);
                        this.txtReceived.SelectionFont = new Font("微軟正黑體", 12, FontStyle.Regular);
                        this.txtMessage.Enabled        = false;
                        this.btnShake.Enabled          = false;
                        this.btnSendMsg.Enabled        = false;
                        this.btnSendFile.Enabled       = false;

                        this.userName_textBox.Enabled = true;
                        this.btnConnection.Enabled    = true;
                        socketClient.Close();
                        receiveFlag = false;

                        break;
                    }
                }
            } catch (Exception ex)
            {
                MessageBox.Show("伺服器連線失敗,3秒後即將關閉視窗..." + ex.Message);
                receiveFlag = false;
                System.Timers.Timer timer = new System.Timers.Timer(3000);
                timer.Enabled  = true;
                timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => { this.Close(); };
            }
        }