当前位置: 首页 > news >正文 socket传文件 news 来源:原创 2024/5/17 14:17:31 private string path = "F://SmartMovie.EXE"; //要发送的文件 private Socket s; private void listen() { string ip = "127.0.0.1"; //远程IP 这里定义为自己的机器 IPAddress[] ih = Dns.GetHostAddresses(ip); //获得IP列表 IPAddress newip = ih[0]; //获取IP地址 int port = 6789; //定义端口 IPEndPoint Conncet = new IPEndPoint(newip, port); //构造结点 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化socket try { s.Connect(Conncet); //连接远程服务器 if (s.Connected) //如果连接成功 s.Connected 则为true 否则为 false { Console.WriteLine("连接成功"); Thread t = new Thread(new ThreadStart(set)); //创建进程 t.Start(); //开始进程 Console.WriteLine("发送完毕") } } catch(NullReferenceException e) { Console.WriteLine("{0}",e); } private void set() //创建set函数 { Console.WriteLine("开始发送数据"); byte[] b = new byte[10000000]; //创建文件缓冲区,这里可以认为文件的最大值 FileStream file = File.Open(path, FileMode.Open,FileAccess.Read); //创建文件流 int start = 0; int end = (int)file.Length; //获取文件长度文件传送如果有需要超过int的范围估计就要改写FileStream类了 try { while (end != 0) { int count = file.Read(b, start, end); //把数据写进流 start += count; end -= count; } while (start != 0) { int n = s.Send(b, end, start, SocketFlags.None); //用Socket的Send方法发送流 end += n; start -= n; } file.Close(); //关闭文件流 s.Close(); //关闭Socket } catch (NullReferenceException e) { Console.WriteLine("{0}", e); } } 这样文件发送的模型就实现了 接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现 private void get() { string path = "G://da.exe"; //接收的文件 FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流 TcpListener listen = new TcpListener(6789); //监听端口 Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义Socket并初始化 try { listen.Start(); //开始监听 s1 = listen.AcceptSocket(); //获取Socket连接 byte[] data = new byte[10000000]; //定义缓冲区 int longer = data.Length; int start = 0; int mid = 0; if (s1.Connected) //确定连接 { Console.WriteLine("连接成功"); int count = s1.Receive(data, start, longer, SocketFlags.None); //把接收到的byte存入缓冲区 mid += count; longer -= mid; while (count != 0) { count = s1.Receive(data, mid, longer, SocketFlags.None); mid += count; longer -= mid; } file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。 s1.Close(); file.Close(); } } catch(NullReferenceException e) { Console.WriteLine("{0}",e); } } 相关文章: c# 文件传输 SQL SERVER 2005分页查询语句 测试mssql中sql语句执行时间 SQL SERVER查询时间条件式写法 C#完整的通信代码(一)(点对点,点对多,同步,异步,UDP,TCP) C#完整的通信代码(二)(点对点,点对多,同步,异步,UDP,TCP) C# byte数组常用扩展 八种情况 C# Stream 和 byte[] 之间的转换 常用SQL/oracle循环语句 ORACLE 字符串操作 jquery下json数组的操作用法实例 c#写windows服务程序 JS操作select相关方法:新增 修改 删除 选中 清空 判断存在 等 js判断undefined类型,undefined,null,NaN的区别 oracle的exp/imp使用方法学习 【Linux系统编程】快速查找errno错误码信息 ECMAScript6(0):ES6简明参考手册 iOS动画编程-View动画[ 1 ] 基础View动画 iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码... JS专题之继承 Laravel 实践之路: 数据库迁移与数据填充 MySQL用户中的%到底包不包括localhost? vue 个人积累(使用工具,组件) Vue 重置组件到初始状态 webpack入门学习手记(二) 产品三维模型在线预览 得到一个数组中任意X个元素的所有组合 即C(n,m) 基于webpack 的 vue 多页架构 力扣(LeetCode)357 聊聊hikari连接池的leakDetectionThreshold 通过npm或yarn自动生成vue组件 网页视频流m3u8/ts视频下载 微信小程序开发问题汇总 异步 责任链模式的两种实现 好程序员web前端教程分享CSS不同元素margin的计算 ... sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。 ubuntu下安装kvm虚拟机 中南建设2022年半年报“韧”字当头,经营性现金流持续为正 ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目 #宝哥教你#查看jquery绑定的事件函数 #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买? (LeetCode C++)盛最多水的容器 (Matlab)遗传算法优化的BP神经网络实现回归预测 (rabbitmq的高级特性)消息可靠性 (第27天)Oracle 数据泵转换分区表 (附源码)spring boot智能服药提醒app 毕业设计 102151 (简单有案例)前端实现主题切换、动态换肤的两种简单方式 (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐 (三) diretfbrc详解 (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項) ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”... .net专家(张羿专栏) /bin/bash^M: bad interpreter: No such file or directory ?
private string path = "F://SmartMovie.EXE"; //要发送的文件 private Socket s; private void listen() { string ip = "127.0.0.1"; //远程IP 这里定义为自己的机器 IPAddress[] ih = Dns.GetHostAddresses(ip); //获得IP列表 IPAddress newip = ih[0]; //获取IP地址 int port = 6789; //定义端口 IPEndPoint Conncet = new IPEndPoint(newip, port); //构造结点 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化socket try { s.Connect(Conncet); //连接远程服务器 if (s.Connected) //如果连接成功 s.Connected 则为true 否则为 false { Console.WriteLine("连接成功"); Thread t = new Thread(new ThreadStart(set)); //创建进程 t.Start(); //开始进程 Console.WriteLine("发送完毕") } } catch(NullReferenceException e) { Console.WriteLine("{0}",e); } private void set() //创建set函数 { Console.WriteLine("开始发送数据"); byte[] b = new byte[10000000]; //创建文件缓冲区,这里可以认为文件的最大值 FileStream file = File.Open(path, FileMode.Open,FileAccess.Read); //创建文件流 int start = 0; int end = (int)file.Length; //获取文件长度文件传送如果有需要超过int的范围估计就要改写FileStream类了 try { while (end != 0) { int count = file.Read(b, start, end); //把数据写进流 start += count; end -= count; } while (start != 0) { int n = s.Send(b, end, start, SocketFlags.None); //用Socket的Send方法发送流 end += n; start -= n; } file.Close(); //关闭文件流 s.Close(); //关闭Socket } catch (NullReferenceException e) { Console.WriteLine("{0}", e); } } 这样文件发送的模型就实现了 接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现 private void get() { string path = "G://da.exe"; //接收的文件 FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流 TcpListener listen = new TcpListener(6789); //监听端口 Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义Socket并初始化 try { listen.Start(); //开始监听 s1 = listen.AcceptSocket(); //获取Socket连接 byte[] data = new byte[10000000]; //定义缓冲区 int longer = data.Length; int start = 0; int mid = 0; if (s1.Connected) //确定连接 { Console.WriteLine("连接成功"); int count = s1.Receive(data, start, longer, SocketFlags.None); //把接收到的byte存入缓冲区 mid += count; longer -= mid; while (count != 0) { count = s1.Receive(data, mid, longer, SocketFlags.None); mid += count; longer -= mid; } file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。 s1.Close(); file.Close(); } } catch(NullReferenceException e) { Console.WriteLine("{0}",e); } }