前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#-多线程和Socket网络编程-C/S传输文件(完結)

C#-多线程和Socket网络编程-C/S传输文件(完結)

作者头像
用户9857551
发布2022-06-28 08:50:42
4300
发布2022-06-28 08:50:42
举报
文章被收录于专栏:Angular学习规划

展示通信結果:

在这里插入图片描述
在这里插入图片描述

上一篇实现了客户端和服务器通信详细: 点这看上一篇:传送门😊

服务器和客户端通信也是相同的道理,但是有一个问题,不只有一个客户端连服务器所以增加了一点改动:增加一个ComboBox来选择与之通信的ip地址,选择后可以与之通信。 具体步骤: 1.建一个键值对集合存放IP地址和端口号 2.点击事件调用Combo Box被选中的IP与之通信 源码: 集合:

代码语言:javascript
复制
//将远程连接的客户端的IP地址和Socket存入集合中
Dictionary<string, Socket> dicScoket = new Dictionary<string, Socket>();

点击事件:

代码语言:javascript
复制
/// <summary>
        /// 服务器给客户端发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            string str = txtMsg.Text;
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            //获取用户在下拉框选中的IP地址
            string ip = cboUsers.SelectedItem.ToString();
            dicScoket[ip].Send(buffer);
            //socketSend.Send(buffer);
        }

那么在这一节开始传输文件

传输文件

传文件对方需要知道接受的是文件还是文字

  • 那么就用到了设计协议
    • 要把传递的字节数组前边都加上一个字节作为标识。比如:0代表文字,1代表文件
    • 即:文字:0+文字(二进制表示)
    • 文件:1+文件的二进制信息

在选择文件按钮的点击事件中加选择文件功能

代码语言:javascript
复制
private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = @"C:\Users";
            ofd.Title = "请选择要发送的文件";
            ofd.Filter = "所有文件|*.*";
            ofd.ShowDialog();
            txtPath.Text = ofd.FileName;
        }

发送文件的点击事件

代码语言:javascript
复制
private void button3_Click(object sender, EventArgs e)
        {
            //获得要发送的路径
            string path = txtPath.Text;
            using (FileStream fsRead=new FileStream(path,FileMode.Open,FileAccess.Read))
            {
                byte[] buffer = new byte[1024*1024*5];
                int r = fsRead.Read(buffer, 0, buffer.Length);
                List<byte> list = new List<byte>();
                list.Add(1);
                list.AddRange(buffer);
                byte[] newBuffer = list.ToArray();
                try
                {
                    dicScoket[cboUsers.SelectedItem.ToString()].Send(newBuffer, 0, r + 1, SocketFlags.None);
                }
                catch//没选IP
                {

                    MessageBox.Show("选IP啊");
                }
                
            }
        }

另外一方选择接收文件: 分别约定了三个事件:

  • 0,是文字
  • 1,是文件
  • 2,是震动 - 震动的实现就是使用Point让form框以两个不同的坐标来回动就可以了
代码语言:javascript
复制
void Recive()
        {
            while (true)
            {
                byte[] buffer = new byte[1024 * 1024 * 3];
                //实际接收到的有效字节数
                int r = socketSend.Receive(buffer);
                //判断是否有数据没有直接结束
                if (r == 0)
                {
                    break;
                }
                //取到传过来的第一位
                int n = buffer[0];
                //根据约定的协议 判断传过来是什么
                if (n == 0)
                {
                    //发送的是文字消息
                    //GetString(buffer, 1, r-1)范围变换了
                    //buffer长度多了一个数字 那就跳过【0】从buffer【1】开始 长度是-1
                    string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
                    ShowMsg(socketSend.RemoteEndPoint + ":" + str);
                }
                else if (n == 1)
                {
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.InitialDirectory = @"C:\Users";
                    sfd.Title = "请选择要保存的文件";
                    sfd.Filter = "所有文件|*.*";
                    sfd.ShowDialog(this);
                    string path = sfd.FileName;
                    try
                    {
                        using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            fsWrite.Write(buffer, 1, r - 1);
                        }

                    }
                    catch//不选文件出的问题
                    {

                        MessageBox.Show("选文件啊");
                    }
                    MessageBox.Show("保存成功");
                }
                else if (n == 2)
                {
                    ZD();
                }
            }
        }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 展示通信結果:
  • 传输文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档