Socket网络编程—简单聊天软件--3、客户端代码

客户端界面:

//创建一个通信Socket
        Socket socketSpeak = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        /// <summary>
        /// 加载客户端
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //取消多线程检查
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        /// <summary>
        /// 向聊天窗口显示信息
        /// </summary>
        /// <param name="str"></param>
        private void ShowMsg(string str)
        {
            txtMsg.AppendText(str + "\r\n");
        }
        /// <summary>
        /// 开始连接服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStart_Click(object sender, EventArgs e)
        {
            IPAddress IP;
            IPEndPoint point;
            try
            {
                //创建IP对像来存储服务器IP地址
                IP = IPAddress.Parse(txtIP.Text);
            }
            catch
            {
                MessageBox.Show("请输入正确的IP地址");
                return;
            }
            try
            {
                //创建一个网络端点对象来存储要连接的服务器网络端口与IP地址
                point = new IPEndPoint(IP, Convert.ToInt32(txtDuan.Text));
            }
            catch
            {
                MessageBox.Show("请输入正确的网络端口");
                return;
            }
            //连接服务器
            socketSpeak.Connect(point);
            ShowMsg("已连接上服务器...");
            //添加新线程来接收信息
            Thread resThread = new Thread(ResMsg);
            resThread.IsBackground = true;
            resThread.Start();
            //清空IP端口信息
            txtDuan.Text = "";
            txtIP.Text = "";
        }
        /// <summary>
        /// 开始不停的接收服务器发来的消息
        /// </summary>
        private void ResMsg()
        {
            while (true)
            {
                //创建一个缓冲区来接收服务器发来的消息
                byte[] buffer = new byte[1024 * 1024 * 3];
                int r = socketSpeak.Receive(buffer);
                //获取第一位字节
                int number = buffer[0];
                if (number == 1)//对方发送的是文字信息
                {
                    //将信息读取到聊天框中
                    ShowMsg(Encoding.Default.GetString(buffer, 1, r - 1)+"\r\n");
                }
                else if (number == 2)//对方发送的是文件
                {
                    //打开保存对话框
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.Filter = "文本类型|*.txt|图片类型|*.jpg|音乐类型|*.mp3|所有文件|*.*";
                    sfd.Title = "请选择要保存的位置";
                    sfd.ShowDialog(this);
                    //获取用户选择的保存地址
                    string path = sfd.FileName;
                    //创建一个流来将接收的文件写入指定地址
                    using (FileStream fsWrite=new FileStream (path,FileMode.OpenOrCreate,FileAccess.Write))
                    {
                        fsWrite.Write(buffer, 0, r - 1);
                        MessageBox.Show("保存成功!");
                    }
                }
                else if (number == 3)//对方发送的是震动
                {
                    ZD();
                    ShowMsg("对方给你发送了一个抖屏"+"\r\n");
                }
                else if (number==0)//发送过来的是对方客户端的IP地址
                {
                    //将IP地址提取出来
                    string fridentIP = Encoding.Default.GetString(buffer, 1, r - 1);
                    //在聊天窗口将对方IP地址展示出来
                    ShowMsg(fridentIP + ":");
                    //检查当前列表中有没有该IP地址
                    if (lbxHaoYou.Items.Contains(fridentIP ))//有
                    {
                        
                    }
                    else//没有,添加进去
                    {
                        //将IP地址添加到列表中
                        lbxHaoYou.Items.Add(fridentIP);
                        //将当期选中的聊天对象选为当前IP
                        lbxHaoYou.SelectedItem = fridentIP;
                    }
                    
                }

            }
        }
        /// <summary>
        /// 添加好友
        /// 自定义协议,发送好友IP地址在字节前加0
        /// 发送文字信息在字节前加1
        /// 发送文件在字节前加2
        /// 发送震动在字节前加3
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //获取用户要添加的好友客户端Ip地址
            IPAddress IP;
            IPEndPoint point;
            try
            {
                //创建IP对像来存储好友IP地址
                IP = IPAddress.Parse(txtIP.Text);
            }
            catch
            {
                MessageBox.Show("请输入正确的IP地址");
                return;
            }
            try
            {
                //创建一个网络端点对象来存储要添加的好友网络端口与IP地址
                point = new IPEndPoint(IP, Convert.ToInt32(txtDuan.Text));
            }
            catch
            {
                MessageBox.Show("请输入正确的网络端口");
                return;
            }
            if (lbxHaoYou.Items.Contains(point))
            {
                ShowMsg("你已经添加了该好友,不能重复添加");
                return;
            }
            else
            {
                //将IP地址添加标签
                byte[] buffer = Encoding.Default.GetBytes(point.ToString());
                byte[] newBuffer = AddNum(buffer, 0);
                //发送IP地址
                socketSpeak.Send(newBuffer);
                //将该客户端好友IP地址信息添加到列表中
                lbxHaoYou.Items.Add(point.ToString());
                lbxHaoYou.Text = point.ToString();
                //清空添加好友文本框
                txtDuan.Text = "";
                txtIP.Text = "";
                //显示添加好友成功
                ShowMsg("添加好友成功,现在你可以双击列表进行聊天哦");
            }
            
        }
        /// <summary>
        /// 将一个字节数组前面添加表示数字
        /// </summary>
        /// <param name="buffer">要添加标签的数组</param>
        /// <param name="number">标签</param>
        /// <returns></returns>
        private byte[] AddNum(byte[] buffer, byte number)
        {
            List<byte> list = new List<byte>();
            list.Add(number);
            list.AddRange(buffer);
            byte[] newBuffer = list.ToArray();
            return newBuffer;
        }
        /// <summary>
        /// 发送文字信息
        /// 标签为1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendWord_Click(object sender, EventArgs e)
        {
            try
            {
                //获取用户选择的要聊天的客户端
                string name = lbxHaoYou.SelectedItem.ToString();
                if (txtOut.Text == "")
                {
                    ShowMsg("你不能发送空信息,请输入后发送!");
                }
                else
                {
                    //添加标签
                    byte[] buffer = Encoding.Default.GetBytes(txtOut.Text);
                    byte[] newBuffer = AddNum(buffer, 1);
                    //发送输入框中的信息
                    socketSpeak.Send(newBuffer);
                    ShowMsg("自己:");
                    ShowMsg(txtOut.Text + "\r\n");
                    //清空输入框
                    txtOut.Text = "";
                }

            }
            catch
            {
                ShowMsg("你并没有选择任何好友进行聊天");
            }

        }
        /// <summary>
        /// 选择要聊天的好友,发送IP地址给客户端
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbxHaoYou_DoubleClick(object sender, EventArgs e)
        {
            string IP = null;
            try
            {
                //获取要聊天的客户端IP地址
                IP = lbxHaoYou.SelectedItem.ToString();
            }
            catch
            {
                ShowMsg("你没点中任何好友哦!");
                return;
            }
            //将IP地址添加标签
            byte[] buffer = Encoding.Default.GetBytes(IP);
            byte[] newBuffer = AddNum(buffer, 0);
            //发送IP地址给客户端
            socketSpeak.Send(newBuffer);
        }
        /// <summary>
        /// 选择要发送的文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFile_Click(object sender, EventArgs e)
        {
            //创建一个打开窗口
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "请选择你要发送的文件";
            ofd.Filter = "文件类型|*.txt|图片类型|*.jpg|音乐类型|*.mp3|所有文件|*.*";
            ofd.Multiselect = false;
            ofd.ShowDialog();

            //获取用户选择的文件地址
            string path = ofd.FileName;
            //将文件地址显示到txtFilePath文本框中
            txtFilePath.Text = path;
        }
        /// <summary>
        /// 震动方法
        /// </summary>
        private void ZD()
        {
            //获取当前窗口的坐标
            Point pointNow = this.Location;
            for (int i = 0; i < 2000; i++)
            {
                //当前X坐标各加10
                this.Location = new Point(pointNow.X + 10, pointNow.Y);
                //当前坐标各加10
                this.Location = new Point(pointNow.X + 10, pointNow.Y + 10);
                //当前X坐标恢复
                this.Location = new Point(pointNow.X, pointNow.Y + 10);
                //当前坐标恢复
                this.Location = new Point(pointNow.X, pointNow.Y);
            }
        }
        /// <summary>
        /// 发送文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //读取要发送文件的地址
            string path = txtFilePath.Text;
            try
            {
                //创建一个流文件来读取要发送的文件
                using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
                {
                    //读取要发送的文件到缓冲区中
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    int r = fsRead.Read(buffer, 0, buffer.Length);
                    //将字节数组转为字符串
                    string file = Encoding.Default.GetString(buffer, 0, r);
                    //将字符串转为字节数组
                    byte[] buffer1 = Encoding.Default.GetBytes(file);
                    //将要发送的字节数组加上标签
                    byte[] newBuffer = AddNum(buffer1, 1);
                    //发送该字节数组
                    socketSpeak.Send(newBuffer);
                    //发送完成
                    ShowMsg("文件发送成功");
                    //清空文件地址框
                    txtFilePath.Text = "";
                    ShowMsg("自己:");
                    ShowMsg("发送文件成功!"+"\r\n");
                }
            }
            catch 
            {
                ShowMsg("你并没有选择要发送的文件");
            }
           
        }
        /// <summary>
        /// 发送抖屏
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            //震动的标示符为3,我们直接发送3即可
            byte[] buffer = new byte[1];
            buffer[0] = 3;
            try
            {
                socketSpeak.Send(buffer);
                ShowMsg("自己:");
                ShowMsg("你向对方发送了震动" + "\r\n");
            }
            catch 
            {
                ShowMsg("你还没有连接上服务器!");
            }
           
        }

这样就写好了客户端,大家可以将服务器端与客户端都打开,来尝试连接对话。

 

打开一个服务器,两个客户端。服务器端打开后输入本机IP地址点击开始监听开始监听接入在客户端输入服务器的IP地址及端口号,点击“点我开始”接入服务器。这时两个客户端都接入了服务器,再让两个客户端其中一个输入对方的IP地址及端口号,点击“添加好友”添加对方客户端,这个时候两个客户端已经连接上了,(此时有个小问题,被加好友的客户端好友列表中有对方的IP地址,但是默认选中其实是无效的,因为此时该客户端并没有发送对方IP地址给服务器,大家可以自己想想解决这个问题)。我们双击选择好友后就可以两个客户端互相聊天了,简单的聊天软件就做好了!谢谢大家!


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值