⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chat_frm.cs

📁 C#实现的网络编程实验聊天程序(含论文)
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Serialization;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Media;

namespace EasyChat
{
    public partial class chat_frm : Form
    {

        #region 私有字段

        /// <summary>
        /// 当前用户名
        /// </summary>
        private string _username = null;

        /// <summary>
        /// 数据缓冲区大小
        /// </summary>
        private int _maxPacket = 2048;

        /// <summary>
        /// 用于接受消息的线程
        /// </summary>
        private Thread _receiveThread = null;

        /// <summary>
        /// 用于接受和发送的网络流,从登录窗体得到
        /// </summary>
        private NetworkStream _nws = null;

        /// <summary>
        /// 服务器套接字的字符串形式,从登录窗体得到
        /// </summary>
        private string _svrskt = null;

        /// <summary>
        /// 播放消息提示的播放器
        /// </summary>
        private SoundPlayer _sp1 = new SoundPlayer(Properties.Resources.msg);
        private SoundPlayer _sp2 = new SoundPlayer(Properties.Resources.nudge);
        /// <summary>
        /// 指示是否最小化到托盘
        /// </summary>
        private bool _hideFlag = false;

        #endregion


        #region 聊天窗体构造函数

        /// <summary>
        /// 构造函数,得到登录窗体的一些信息
        /// </summary>
        /// <param name="userName">当前用户名</param>
        /// <param name="nws">接受和发送消息的网络流</param>
        /// <param name="svrskt">服务器套接字的字符串形式</param>
        public chat_frm(string userName, NetworkStream nws, string svrskt)
        {
            InitializeComponent();
            _username = userName;
            _nws = nws;
            _svrskt = svrskt;
        }

        #endregion


        #region 聊天窗体的私有方法

        /// <summary>
        /// 保存聊天记录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void save_btn_Click(object sender, EventArgs e)
        {
            DialogResult ret;
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "文本文件(*.txt)|*.txt";
            sfd.AddExtension = true;
            if ((ret = sfd.ShowDialog()) == DialogResult.OK)
            {
                chatrcd_rtb.SaveFile(sfd.FileName, RichTextBoxStreamType.PlainText);
            }
        }

        /// <summary>
        /// 清除聊天记录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void clear_btn_Click(object sender, EventArgs e)
        {
            DialogResult ret;
            ret = MessageBox.Show("确定清除吗?清除后不可恢复。", 
                                  "提示",
                                  MessageBoxButtons.OKCancel,
                                  MessageBoxIcon.Question, 
                                  MessageBoxDefaultButton.Button2);

            if (ret == DialogResult.OK)
            {
                chatrcd_rtb.Clear();
            }
        }

        /// <summary>
        /// 向服务器发送离线请求,结束接受消息线程,清理资源并关闭父窗体和自身窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void close_btn_Click(object sender, EventArgs e)
        {
            DialogResult ret;
            ret = MessageBox.Show("确定与服务器断开连接吗?", 
                                  "退出",
                                  MessageBoxButtons.OKCancel,
                                  MessageBoxIcon.Question,
                                  MessageBoxDefaultButton.Button2);

            if (ret == DialogResult.OK)
            {
                //向服务器发送离线请求
                _nws.Write(new byte[] { 0, 1 }, 0, 2);
                //结束接受消息的线程
                if (_receiveThread != null)
                {
                    _receiveThread.Abort();
                }
                //关闭网络流
                _nws.Close();
                //关闭父窗口及自身
                this.Owner.Close();
                this.Close();
            }
        }

        /// <summary>
        /// 提取命令
        /// 格式为两个一位整数拼接成的字符串。
        /// 第一位为0表示客户机向服务器发送的命令,为1表示服务器向客户机发送的命令。
        /// 第二位表示命令的含义,具体如下:
        /// "11"-服务器要求客户机更新在线列表
        /// "12"-服务器要求客户机做闪屏振动
        /// default-接受用户消息或者系统消息的正文
        /// </summary>
        /// <param name="s">要解析的包含命令的byte数组,只提取前两个字节</param>
        /// <returns>拼接成的命令</returns>
        private string DecodingBytes(byte[] s)
        {
            return string.Concat(s[0].ToString(), s[1].ToString());
        }

        /// <summary>
        /// 接受消息的线程执行体
        /// </summary>
        private void ReceiveMsg()
        {
            while (true)
            {
                byte[] packet = new byte[_maxPacket];
                _nws.Read(packet, 0, packet.Length);
                string _cmd = DecodingBytes(packet);

                switch (_cmd)
                {
                    /// "11"-服务器要求客户机更新在线列表
                    /// "12"-服务器要求客户机做闪屏振动
                    /// default-接受用户消息或者系统消息的正文
                    case "11":
                        {
                            byte[] onlineBuff = new byte[_maxPacket];
                            int byteCnt = _nws.Read(onlineBuff, 0, onlineBuff.Length);
                            IFormatter format = new BinaryFormatter();
                            MemoryStream stream = new MemoryStream();
                            stream.Write(onlineBuff, 0, byteCnt);
                            stream.Position = 0;
                            StringCollection onlineList = (StringCollection)format.Deserialize(stream);
                            online_cb.Items.Clear();
                            foreach (string onliner in onlineList)
                            {
                                if (!onliner.Equals(_username))
                                {
                                    online_cb.Items.Add(onliner);
                                }
                            }
                            break;
                        }
                    case "12":
                        {
                            Nudge();
                            break;
                        }
                    default:
                        {
                            string displaytxt = Encoding.Unicode.GetString(packet);
                            chatrcd_rtb.AppendText(displaytxt);
                            _sp1.Play();
                            break;
                        }
                }
            }
        }

        /// <summary>
        /// 启动接受消息线程并显示相关信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chat_frm_Load(object sender, EventArgs e)
        {
            _receiveThread = new Thread(new ThreadStart(ReceiveMsg));
            _receiveThread.Start();
            online_cb.Enabled = false;
            user_lb.Text   = "当前用户:" + _username;
            svrskt_lb.Text = "服务器:" + _svrskt;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -