【黑马程序员】Socket文件传输

2024-06-07 17:48

本文主要是介绍【黑马程序员】Socket文件传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


我们利用Socket网络编程不仅可以传送文字,也可以传送文件。不论是文字还是文件,我们都需要先把它们转换为字节流(byte[]类型)才能传输。当接收的那一方的Recive()方法监听到有数据传送过来之后,就会把它从字节流转换回文字或文件。那么程序如何在接收到字节流的时候,判断它是文字还是文件呢?这就要求我们给这个字节流添加一个特殊标识,比如说,如果标识是0,它接收到的是文字,如果标识是1,那么它接收到的是文件。这个标识应该在发送这段字节流之前就赋予byte类型的数组。在发送一方,当我们把某一个要发送的文件转换为字节流的时候,可以把第一个位置(索引为0)空出来,然后把这个位置的值赋予0(表示文字)或1(表示文件)。具体代码如下所示:

/// <summary>/// 浏览按钮点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnBrowser_Click(object sender, EventArgs e){//使用打开文件控件找到要发送的文件,并获取它的路径OpenFileDialog ofd = new OpenFileDialog();if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK){txtFilePath.Text = ofd.FileName;    //显示路径}}/// <summary>/// 发送文件按钮事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSendFile_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(txtFilePath.Text))   //非空验证{MessageBox.Show("请选择发送的文件路径");return;}//创建一个字节数组,用于保存读取文件的数据流byte[] arrFile = new byte[1024 * 1024 * 2];//创建文件流,传入文件路径using (FileStream fs = new FileStream(txtFilePath.Text.Trim(), FileMode.Open)){arrFile[0] = 1;   //把字节数组第一个位置的值赋予1,表示传送的是文件//使用文件流的Read()方法把要发送的文件转换为字节赋予arrFile数组,//由于索引为0的位置已被赋值,所以真正存储文件字节的起始位置为1fs.Read(arrFile, 1, arrFile.Length - 1);//利用当前已经建立连接的Socket把要传输的字节发送出去socketClient.Send(arrFile);}}
在接收方收到数据(byte[])后,会先判断是文字还是文件,即判断获得的byte类型的数组的第一个位置的值。具体代码如下:
/// <summary>/// 发送消息按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSendMsg_Click(object sender, EventArgs e){//把发送的消息转换为字节数组byte[] arrSendMsg = Encoding.UTF8.GetBytes(txtMessage.Text.Trim());//按照选定的IP端口,把消息发送到该客户端上connSockets[lbUniqueSign.SelectedItem.ToString()].Send(arrSendMsg);//显示消息ShowMsg(endpoint.ToString() + "发送消息:");ShowMsg("\t"+txtMessage.Text.Trim());}        /// <summary>/// 循环接收客户端发送过来的数据/// </summary>/// <param name="socketParam">当前与客户端通信的Socket</param>private void ReciveMessage(object socketParam){//把参数由object类型转换为Socket类型Socket socketClient = socketParam as Socket;while (true){//声明一个2M空间的字节数组byte[] arrRecMsg = new byte[1024 * 1024 * 2];//把接收到的字节存入字节数组中,并获取接收到的字节数int length = socketClient.Receive(arrRecMsg);//先取出字节数组中的值进行判断if (arrRecMsg[0] == 0)   //当前数据是文字{//按照接收到的实际字节数获取发送过来的消息ShowMsg(socketClient.RemoteEndPoint.ToString() + ":");ShowMsg("\t" + Encoding.UTF8.GetString(arrRecMsg, 1, length-1));}else    //当前数据是文件 {SaveFileDialog sfd = new SaveFileDialog();  //把文件另存为...//DialogResult dr = sfd.ShowDialog();if (sfd.ShowDialog() == DialogResult.OK){string savePath = sfd.FileName;using (FileStream fs = new FileStream(savePath,FileMode.Create)){fs.Write(arrRecMsg, 1, length - 1);  //保存传送过来的文件ShowMsg("文件保存成功!" + savePath);}}}}}



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------





这篇关于【黑马程序员】Socket文件传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039873

相关文章

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

Java Socket服务器端与客户端的编程步骤总结

一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象; 可以通过InetAddress类的静态方法获得InetAddress的对象; InetAddress.getLocalHost(); InetAddress.getByName(""); 类主要方法: String - address.getHostName(); String - addre

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

程序员必备心理学——心流

心理学之心流 前言一、“心流”是什么?二、心流的好处二、如何进入心流心流状态的四个阶段第一个阶段:挣扎第二个阶段:放松第三个阶段:心流第四个阶段:巩固 进入心流的技巧 总结题外话 前言 你是否常常感觉自己明明学习了一整天,但是就是感觉没有太多的收获。这个时候除了你的学习方向等问题之外,也可能是你的学习方法太低效了。作者本人就经常有这种情况,好在偶然间在b站刷到一个大佬的这个心

程序员都在使用的画图工具

大家好,我是袁庭新。 程序员都在使用的画图工具,你一定没用过这款画图工具吧!我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的,如下图所示: 再例如Redis集群故障恢复原理图我也是通过draw.io工具绘制的,如下图所示: 是不是觉得draw.io绘制的图形特别简洁、美观。它的官网是: https://www.drawio.com dra

远程桌面文件传输异常或者取消传输后一直显示正在取消

环境: Window Servers 2008 R2 摘要说明: 本篇文章主要讲述当应用远程桌面进行文件传输时,若因网络等导致进程中断,再次传输时则不能进行文件传输;或者传输时取消传输,然后一直显示正在取消。此时可以通过重启window的rdpclip.exe进程来解决此问题 步骤 1.关闭rdpclip.exe进程 远程桌面连上上传输异常的服务器,打开资源管理器,在进程列关闭rdpc

GitHub:代码是程序员沟通最直接的手段

如果不是 Andreessen horowitz 的投资,估计 GitHub 很难被福布斯、CNN、纽约时报等传统媒体注意到。普通大众之前不了解这个工具,是因为它距离记者的世界太远了——GitHub 是一个程序员所使用的托管项目的服务。 但在一些程序员眼里,它不仅是托管项目的地方,还是“开源”项目的大本营,而且是提高程序员“技术水平”和“技术品味”的地方,更是一个程序员社交的地方。

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所

黑马程序员---空中网面试题

空中网4k/5k月薪挑选大四实习生的线程题     两年前,我们一个大四的学员去应聘空中网的实习生职位,空中网只给他出了三道线程题,拿回家做两天后再去给经理讲解,如果前两题做好了给4k月薪,第三道题也做出来的话就给5k的月薪。这样的实习薪水和招聘要求,不需要有工作经验的限制,纯粹是技术功底的比拼和考核,而不像许多其他公司非要招两年工作经验的人,逼得那些刚毕业和未毕业的大学生不得不去撒谎,不得不去做

黑马程序员---线程并发库

软件包 java.util.concurrent 在并发编程中很常用的实用工具类。 请参见:            描述 接口摘要BlockingDeque<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。BlockingQueue<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及