// 傳送訊息 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("伺服器停止回應"); } }
//傳送檔案 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 = ""; }
//傳送檔案 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()); //傳送出去 }
// 傳送訊息 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("伺服器停止回應"); } }
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 } }
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); } } }
// 監聽接收訊息的線程 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); } }
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); } } }
//叮咚 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()); }
//叮咚 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; }
// 永久監聽線程 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(); }; } }