如何使用C#将指定文件上传到服务器端

797科技网 0 2024-11-16 06:45

一、如何使用C#将指定文件上传到服务器端

在C#开发中,经常需要实现文件上传的功能。本文将介绍如何使用C#编写代码,将指定文件上传到服务器端。无论是上传图片、文档还是其他类型的文件,以下步骤都适用。

步骤一:创建上传表单

首先,在网页或应用程序中创建一个上传表单以便用户选择文件。可以使用HTML的<form>元素,并将其方法(method)属性设置为POST,同时添加一个类型为“file”的<input>元素用于文件选择。这样用户就可以通过点击“浏览”按钮选择要上传的文件。

步骤二:服务器端配置

在服务器端,需要进行一些配置以便能够接收并处理文件上传。常见的服务器端语言如PHP、ASP.NET等都提供了相应的文件处理API。在C#中,我们可以使用ASP.NET的HttpPostedFile类来接收上传的文件。还可以通过配置服务器端的最大文件大小、允许的文件类型等来增强安全性。

步骤三:上传文件的代码实现

在C#中,我们可以使用HttpPostedFile类的实例来处理上传的文件。可以通过调用HttpPostedFile的SaveAs方法将上传的文件保存到服务器上的指定位置。在保存文件之前,可以进行一些检查,如文件类型检查、文件大小检查等,以确保上传的文件满足要求。

步骤四:异常处理和用户反馈

在上传文件的过程中,可能会出现各种异常情况,如文件大小超过限制、文件类型不支持等。因此,在编写代码时,需要进行适当的异常处理,并向用户提供友好的反馈信息。可以通过try-catch语句捕获异常,并向用户显示相应的错误信息,以指导用户如何解决问题。

总结

通过以上步骤,我们可以使用C#编写代码将指定文件上传到服务器端。无论是网页还是桌面应用,只要按照以上的步骤进行操作,就可以实现文件上传功能。同时,在实际开发过程中,我们还可以添加一些附加的功能,如进度条显示、文件重命名等,以提升用户体验。

感谢您阅读本文,希望通过本文对您有所帮助!

二、java 文件上传到linux服务器端

Java文件上传到Linux服务器端的最佳实践

在开发Web应用程序时,文件上传是一个常见的功能需求。无论是用户上传头像、文档,还是其他类型的文件,都需要在服务器端进行处理。而对于使用Java语言开发的应用程序,将文件上传到Linux服务器端是一个常见的情况。本文将探讨如何在Java应用程序中实现文件上传到Linux服务器的最佳实践。

1. 使用Apache Commons FileUpload

Apache Commons FileUpload 是一个流行的开源库,用于处理文件上传功能。通过引入该库,可以简化Java应用程序中处理文件上传的过程。首先,您需要在项目中添加对该库的依赖。然后,可以使用其中提供的类来处理文件上传的逻辑。在处理文件上传时,确保设置合适的文件大小限制、文件类型限制等,以提高安全性。

2. 配置Linux服务器端环境

在将文件上传到Linux服务器端之前,需要确保服务器端环境已经做好了相应的配置。首先,确保目标目录有足够的写入权限,以便接收上传的文件。其次,考虑使用安全的传输协议,如SFTP,以加强文件传输的安全性。另外,及时清理服务器上的无用文件,以释放存储空间。

3. 使用SSH进行文件传输

在Java程序中实现文件上传到Linux服务器端时,可以考虑使用SSH协议进行文件传输。SSH是一种安全的远程登录协议,可以通过Java程序来调用SSH命令实现文件的上传。通过建立安全的SSH连接,可以确保文件传输的安全性和稳定性。

4. 实现断点续传功能

对于大文件的上传,断点续传是一个非常重要的功能。通过实现断点续传,可以在文件上传过程中出现意外中断时,能够从中断处继续上传,而不用重新上传整个文件。考虑在Java应用程序中实现断点续传功能,以提高用户体验和文件上传的效率。

5. 异步文件上传处理

为了提高系统的性能和响应速度,可以考虑使用异步文件上传处理。通过在Java应用程序中引入异步处理机制,可以将文件上传操作放入后台线程中进行处理,从而不会阻塞主线程。这样可以提高系统的并发能力和性能表现。

6. 日志记录和错误处理

在文件上传过程中,及时记录日志信息是非常有必要的。通过记录上传日志,可以方便后续对文件上传情况进行监控和追踪。另外,合理处理文件上传过程中可能出现的错误和异常情况,保证系统的稳定性和可靠性。

7. 测试和优化

最后,在实现文件上传到Linux服务器端的功能后,务必进行全面的测试和优化。通过模拟不同的上传场景,测试文件上传的性能和稳定性。根据测试结果,进行必要的优化和调整,以确保文件上传功能能够在不同条件下正常运行。

文件上传功能是Web应用程序中一项重要而常见的需求。通过遵循最佳实践、合理配置服务器环境、使用安全的传输协议以及进行充分的测试,可以保证文件上传到Linux服务器端的顺利进行。希望本文介绍的内容对您在Java开发中实现文件上传功能有所帮助。

三、wps表格传到qq上

如何 将WPS表格传到QQ上

在日常工作中,我们经常需要在不同的平台之间共享文件。今天,我将向大家展示如何将WPS表格文件传到QQ上,实现跨平台数据共享的便捷操作。

步骤一:打开WPS表格应用

首先,确保您的设备已经安装了WPS表格应用。打开应用后,您可以看到您需要传输的表格文件已经保存在其中。

步骤二:选择要传输的表格文件

浏览您的文件列表,找到您需要传输的表格文件。可以是工作表、数据报告或任何其他类型的表格文件。

步骤三:导出表格文件

在WPS表格应用中,选择您要传输的表格文件,然后导出文件。您可以在菜单栏中找到“导出”选项。点击导出后,选择文件格式和保存路径。

步骤四:登录QQ并选择传输方式

打开QQ应用,并登录您的账号。在QQ聊天界面中,选择需要传输文件的联系人或群聊。然后点击文件传输按钮,选择刚刚导出的表格文件。

步骤五:发送文件

点击发送按钮,等待文件上传完成。一旦文件上传成功,接收方就可以在QQ上收到您传输的WPS表格文件。

注意事项:

  • 请确保您的WPS表格应用和QQ应用都是最新版本,以确保文件传输的顺利进行。
  • 在传输过程中,尽量保持网络稳定,避免因网络问题导致传输失败。
  • 如果文件较大,建议压缩文件后再进行传输,以节省传输时间和流量消耗。

总的来说,将WPS表格传到QQ上是一项简单而实用的操作。通过以上步骤,您可以轻松地在不同平台之间分享和传输表格文件,提高工作效率,更好地与他人合作。

希望本篇文章对您有所帮助,如果您有任何疑问或意见,欢迎在评论区留言,我会尽快回复您。谢谢阅读!

四、手机软件传到电脑上

手机软件传到电脑上

在现代科技高度发展的时代,手机软件的使用已经成为人们日常生活中不可或缺的一部分。然而,有时候我们可能希望将手机上的软件传输到电脑上进行管理或备份,这就需要一定的操作步骤来实现。本文将介绍手机软件传到电脑上的几种方法,帮助您轻松实现这一目标。

通过USB连接传输

最常见的将手机软件传到电脑上的方式就是通过USB连接。您只需要一根USB数据线将手机和电脑连接起来,然后在电脑上打开手机的存储设备,即可看到手机中的文件。您可以将想要传输的软件文件复制到电脑上进行存储或备份。

使用云服务传输

除了通过USB连接,您还可以利用云服务来传输手机软件到电脑上。通过将手机软件上传到云端,您可以在电脑上登录相同的云服务账户,然后从云端下载手机软件至电脑。这种方法适用于需要在多台设备之间同步文件的场景。

通过第三方工具传输

另一种常用的方式是通过第三方工具来传输手机软件到电脑上。有许多软件和应用程序可以帮助您实现这一目标,例如AirDroid、Moborobo等。这些工具通常提供更为便捷的操作界面和功能,让手机软件传输变得更加简单快捷。

使用传输线路

如果您想要更快速地传输手机软件到电脑上,可以考虑使用传输线路。传输线路可以通过USB接口连接手机和电脑,实现高速数据传输。这种方法适用于需要频繁传输大容量文件的情况,让您节省宝贵的时间。

通过邮箱传输

除了以上的方法,您还可以通过邮箱将手机软件传输到电脑上。将手机软件打包成压缩文件或直接发送至邮箱,然后在电脑上登录相同的邮箱账户即可下载。这是一种简单实用的传输方式,适合在急需备份或分享文件时使用。

总结

通过以上几种方法,您可以轻松将手机软件传输到电脑上进行管理或备份。无论是通过USB连接、云服务、第三方工具、传输线路还是邮箱,都能帮助您实现这一目标。选择适合自己需求和习惯的传输方式,让您的手机软件管理更加高效便捷。

五、尼康相机传到电脑上显示logo

尼康相机是摄影爱好者和专业摄影师们首选的品牌之一。无论是外出旅行、举办婚礼、拍摄纪录片还是做商业摄影,尼康相机都以其出色的性能和可靠的品质赢得了全球用户的信任和赞誉。

然而,有时候当我们尝试将尼康相机传输到电脑上时,可能会出现一些问题,比如出现尼康相机显示logo的情况。这个问题可能会让一些初次使用尼康相机的用户感到困惑和苦恼。在本文中,我将为大家详细介绍尼康相机显示logo的原因以及解决方法。

可能的原因

尼康相机在传输到电脑时显示logo的原因可能有多种,以下是一些常见的原因:

  1. USB 连接问题:如果您的尼康相机通过 USB 连接到电脑,可能出现连接故障或松动,导致相机与电脑之间的通信中断。
  2. 驱动程序问题:您的电脑可能缺少必要的驱动程序,或者驱动程序与尼康相机不兼容。
  3. 相机设置问题:您的尼康相机可能有一些设置问题,导致无法正确识别并连接到电脑。
  4. 电脑系统问题:您的电脑系统可能存在一些故障或错误,导致无法与尼康相机进行正常通信。

解决方法

根据以上可能的原因,我们可以尝试以下几种解决方法:

  1. 检查 USB 连接:首先,您需要确保尼康相机与电脑之间的 USB 连接正确无误。可以将 USB 线缆重新连接一次,或者尝试使用另一根 USB 线缆来排除线缆本身的问题。
  2. 安装驱动程序:在您的电脑上,可能需要安装或更新尼康相机的驱动程序。您可以访问尼康官方网站,下载最新的驱动程序并按照说明进行安装。
  3. 检查相机设置:请确保您的尼康相机在接入电脑之前已经正确设置。您可以参考相机的用户手册或尼康官方网站上的教程,了解正确的设置步骤。
  4. 尝试其他电脑:如果您手头没有其他电脑可供尝试,您可以尝试将尼康相机连接到朋友或同事的电脑上,以确认问题是由相机还是您的电脑引起的。
  5. 更新电脑系统:如果您的电脑系统已经很长时间没有更新,可能存在一些与外部设备兼容性相关的问题。请尝试更新您的电脑系统,并再次尝试连接尼康相机。

如果您尝试了以上所有方法仍然无法解决尼康相机显示logo的问题,我建议您联系尼康售后服务中心或就近的专业维修店寻求帮助。专业的技术人员将会针对您的具体情况提供有效的解决方案。

总结

尼康相机是一款优秀的摄影工具,但有时候在传输到电脑上时可能会出现显示logo的问题。本文讨论了尼康相机显示logo的可能原因,以及如何解决这个问题。通过仔细检查 USB 连接、安装驱动程序、调整相机设置、尝试其他电脑和更新电脑系统等方法,我们可以解决这个问题并顺利将尼康相机与电脑连接起来。

作为尼康用户,我们希望能够充分利用这款优秀的相机,将我们的创意和灵感记录下来。希望本文对您解决尼康相机显示logo问题有所帮助。如果您有任何其他问题或疑问,欢迎在评论区留言,我将竭诚为您解答。

六、字体传到别的电脑上不识别

如何解决字体传到别的电脑上不识别的问题

对于许多设计人员和开发人员来说,字体在他们的工作中起着至关重要的作用。选择适当的字体可以提升设计作品的整体效果,并使其与品牌形象更加一致。然而,当我们将字体传输到另一台电脑上时,有时候会面临字体不被识别的问题,这给工作带来了一些麻烦。本文将探讨如何解决字体传到别的电脑上不被识别的问题,为设计和开发人员提供一些实用的解决方案。

1. 使用Web Safe字体

如果你在设计中使用的字体无法在其他电脑上进行正确显示,一种简单而可靠的解决方案是使用Web Safe字体。Web Safe字体是指在几乎所有计算机和操作系统上都能正常显示的字体。这些字体包括Arial, Helvetica, Times New Roman, Verdana等。在设计过程中,选择这些字体作为备选方案,可以确保你的设计在其他电脑上也能完美呈现。

2. 嵌入字体

当你使用的字体不属于Web Safe字体时,你可以尝试将字体文件嵌入到你的设计项目中。嵌入字体将字体文件与设计文件捆绑在一起,确保字体在其他电脑上的正确显示。

在CSS中,你可以使用@font-face规则来嵌入字体。这个规则允许你引用自定义字体文件,并将其应用于你的网页或应用程序。请注意,在嵌入字体时,请遵循版权规定并获得相应的许可。

@font-face { font-family: "CustomFont"; src: url("customfont.ttf") format("truetype"); }

在上面的示例中,"CustomFont" 是你所指定的字体名称,"customfont.ttf" 是字体文件的路径和文件名。

3. 提供字体文件下载

如果你希望确保其他人能够正确显示你的设计作品中所使用的字体,你可以提供字体文件的下载链接。这样,其他人在查看你的设计时可以下载并安装相应的字体。

在网页设计中,你可以使用CSS的@font-face规则来定义字体,并在其中包含字体文件的下载链接。例如:


@font-face {
    font-family: "CustomFont";
    src: url("fonts/customfont.ttf") format("truetype");
}

body {
    font-family: "CustomFont", Arial, sans-serif;
}

通过上述方式,你可以将字体文件放置在一个指定的目录中,并通过相对路径来引用。这样其他人在访问你的设计作品时,可以通过下载字体文件来确保正确显示。

4. 使用系统默认字体

如果以上解决方案无法满足你的需求,又不希望给其他人带来麻烦,你可以考虑使用操作系统的默认字体。几乎所有操作系统都有自己的默认字体,这些字体在大多数情况下都能提供清晰的显示效果。

在CSS中,你可以使用通用字体系列来指定系统默认字体。例如:


body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
}

在上面的示例中,-apple-system, BlinkMacSystemFont 是专为Mac和iOS设备设计的字体系列,"Segoe UI" 是Windows系统的默认字体系列,其他字体系列依次是其他操作系统的默认字体。

5. 转换字体格式

当你将字体传输到其他电脑上时,一些字体文件格式可能无法被识别。在这种情况下,你可以尝试将字体文件转换为其他常见的字体格式,如WOFF(Web开放字体格式)或WOFF2。

有许多在线转换工具可以帮助你将字体文件转换为其他格式。你只需要上传字体文件并选择你想要的格式,工具会为你生成转换后的文件。

转换字体格式可能会导致一些字体特性的丢失,因此在转换之前请确保备份原始字体文件,并在转换后对设计作品进行适当的测试和调整。

总结

当我们将字体传输到其他电脑上时,字体不被识别的问题可能会给我们的工作带来一些困扰。本文介绍了一些解决字体不被识别问题的方法,包括使用Web Safe字体、嵌入字体、提供字体文件下载、使用系统默认字体以及转换字体格式。

除了上述方法,还有其他一些解决方案,例如使用第三方字体库或在线服务,这些方案可以根据你的具体需求和项目要求进行选择。

无论你选择哪种解决方案,都请记住要遵循版权规定,并获得相应字体的许可。通过合理使用字体,我们可以确保设计作品在任何电脑上都能达到预期效果,并且为观众带来良好的用户体验。

七、荣耀8c怎么把照片传到电脑上?

你说的款荣耀手机想要把照片传到电脑上的话,可以直接使用U盘,将照片从手机里拷贝出来,在拷贝到电脑上。

当然也可以使用数据线,一头插在手机的充电接口上,另一头插在电脑主机的USB接口上,在手机上选择文件传送模式,就可以直接在电脑里将手机的照片拷贝出来。

八、计算机学生linux服务器端开发语言选择请教:C/C++/Java?

经历过和题主一样的纠结、选择,最终我选了 C++

选择那一门语言对学习linux服务器端编程最有帮助?

毫无疑问,C++!

学C++,其实约等于掌握了 C + C++,并且后续掌握 Java 也会很快,毕竟C++学习曲线会陡一些。

单独学 C可能很难找到互联网相关工作。

为什么我推荐 C++?

因为你想学习 Linux 服务端编程,那么选择 Linux C++ 就是最好的方式。

我本来大二一直都在学Java的,后来大二下开始转 Linux C++,在校招中也顺利拿到了腾讯微信后台 C++ offer,所以我相信我的路线一定对你或者后来的学弟学妹们有帮助!

这样的学习路线相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,在这里,不能是简单的堆砌学习资源和书单推荐,更要细化如何有效的去执行落地。

争取做到让看到的同学有一种相见恨晚的感觉哈哈哈。

所以大家可以试着看一下,帮我检查下有没有达到预想的效果哈哈,希望不要被打脸

那就正式开始吧。

(学习路线有点长,先给大家一波我的面经、看的书、刷题笔记等汇总:

绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,需要看了,去网上挨个找的,最后汇总而成。这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精。

我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统

下载链接:

计算机必看经典书单

干货 |收藏

一、后端/后台/服务器开发?

经常在各大公司招聘上看到后端、后台、服务器开发等等,有些同学经常被这些名词搞混。

其实这些名词都是相近的,但是也有点区别,这里说说我的理解:

  • 首先一般公司分为前端和后端,前端就是和用户打交道的,负责用良好的视觉效果将数据呈现给用户,广义的前端包括客户端(安卓、IOS)、Web前端、小程序等。
  • 而与之对应的后端则是负责业务逻辑处理,比如下单、支付等,重在业务流程的处理。

后台一般和后端是一个意思,而服务器开发则稍微广义一点,不仅包含了后台开发,而且也包括支撑整个后台应用的基础开发,比如搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。

后台/后端重在业务处理,是偏向应用层开发,而服务器开发不仅包括应用层开发,更是囊括了整个支撑后台业务的相关组件的开发。

那 Linux C/C++ 服务器/后台开发指的什么呢,其实就是基于 Linux 上 的 C++ 编程。

但是相比 Java 系更强调 Linux 系统编程、网络编程能力,有的还会涉及到服务端底层协议和网络框架开发。

传统的 Java 、Go后台开发偏向 Web 开发,也就是接收前端请求,通过微服务互相调用,完成业务逻辑处理,然后返回给前端。

实际上在腾讯这边的 C++ 后台开发,也是类似的,本身有非常成熟的基于 C++ 的微服务体系,大多数开发也只需要关注业务逻辑就好,不过还是会要求 Linux 系统编程、网络编程等能力。

二、后台开发都考察哪些?

一般来说 Linux C/C++ 后台开发方向涉及以下这些基础知识:

  • C/C++ 语言特性和实现原理
  • 计算机网络
  • 网络编程 和 Linux 系统编程
  • 操作系统原理
  • 部分 Linux 内核原理,如内存管理、文件系统、虚拟内存等
  • Linux 常见命令使用
  • 算法与数据结构
  • 数据库使用及原理
  • 常见 NoSQL组件,如 Redis、Memcached
  • 版本控制 Git

非必选加分项:

  • 分布式相关,如一致性协议比如 Raft 算法、分布式存储等
  • docker、k8s 等虚拟化和云计算相关的
  • 系统设计能力,如短链服务、评论服务、Feed流系统、抢红包、秒杀等

由于篇幅限制,这篇文章主要介绍基础知识的学习路线和方法,其它加分项以后再单独写。

三、C/C++

首先是语言的基础知识,一些关键字和实现原理等:

  • 指针、引用、数组、内存
  • 引用与指针区别
  • C 和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别
  • 虚机制:虚函数、虚函数表、纯虚函数
  • 继承、虚继承、菱形继承等
  • 多态: 动态绑定,静态多态
  • 重写、重载
  • 智能指针原理:引用计数、RAII(资源获取即初始化)思想
  • 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
  • 一些关键字的作用:static、const、volatile、extern
  • 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
  • STL部分容器的实现原理,如 vector、deque、map、hashmap
  • 模板特化、偏特化,萃取 traits 技巧
  • 编译链接机制、内存布局(memory layout)、对象模型
  • C++11 部分新特性,比如右值引用、完美转发等

这里列出来的只是一些比较重要的部分,实际上可能只算 C++ 的冰山一角, 大家且学且珍惜吧,这不 C++11 还没整透彻,C++ 20 又出来了,生命不息,学习不止。

怎么学?

1. 《C++ Primer》

这本书基本包括了 C++ 11 的全部特性,最好把前面三部分:C++基础、C++标准库、类设计者的工具都看一遍,我当时花了一个多月断断续续看到了第16章模板那里。

2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》

第一本是重点,光看《C++ Primer》缺少实践的话,大概率还写不出合格的 C++ 代码,而《Effective C++》就是通过 55 条非常具体的做法告诉你什么样才是符合 C++ 编码规范的,可以缩短你写出合格 C++ 代码的时间,减少踩坑,强烈推荐必读,后面两本优先级稍低,可以有时间再读。

3. 《STL 源码剖析》和《深度探索 C++ 对象模型》

看完 Primer 和 Effective,你应该已经能够比较熟练的使用C++了,但是还缺少对 C++ 底层实现机制的认识。比如虚函数表、成员变量布局等,同时对于 STL 库可能也仅仅停留在使用上。 推荐的这两本可以分别完善你在 C++ 底层实现和 STL 源码、原理上的认识。

以上书籍同时建议和侯捷老师的视频配合服用,效果更佳。

直接在 B 站搜索「候捷 C++」即可,主要有以下几个系列:

  • 《C++内存管理》
  • 《STL源码分析》
  • 《C++ STL与泛型编程高级》
  • 《C++11 新特性》

我基本都看了,收获挺大的,建议看下,可以开倍速。

最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用:

侯捷C++全套视频|含下载方式

看完以上资料,算是 C++ 入门了,应付面试也是足够的,基本到达了正确高效地使用 C++ 这一层面。

是不是听到这有点崩溃,特么的看了这么多,才入门???

如果你想在 C++ 语言上更进一步,那么有以下的书籍推荐:

  • 《C++ 语言的设计与演化》
这本书是 C++ 之父 Bjarne Stroustrup 写的,关于 C++ 的前世今生,以及未来的演进方向,可以了解 C++ 的设计哲学。C++ 复杂的语言特性一直让人诟病,通过这本书,可以看到各种特性引入的目的,也更深入了解到了 C 和 C++ 之间关系。比如 C++ 里有个原则就是所有的实现机制都不能带来额外的运行时开销。

我也正在看这本书。

  • 《C++ 沉思录》
  • 《C++ Templates》和《C++模版元编程》
C++模板元编程属于另外一个世界了,一般公司里开发用得比较少,这个也是一个大坑,如果实在感兴趣可以去看看,感受下 C++ 的博大精深,不过这玩意我也不太会,也不推荐你去花时间在上面。
  • CppCon视频
这是 C++ 社区组织的类似开源峰会那种,每次都会讨论一些关于 C++ 的话题,没事去刷一个,还是挺有意思的。 Youtube 直接搜 CppCon 即可找到。

四、操作系统

操作系统这门课,我的感觉是易学难精,但是掌握到日常编程和面试够用还是比较容易的。

那么毕业生或者说你去准备校招面试应该达到怎样的水平:

  • OS 四大模块的理论知识: 进程与线程管理、内存管理、IO与文件系统、设备管理
  • 了解 Linux 内核部分实现原理,如内存管理、进程管理、虚拟文件系统等

其中内存、进程、IO 是重点,这几块也是和编程关系最密切的,这里推荐先挑本偏理论的书看看,了解操作系统的全貌:

  • 《现代操作系统》
  • 《操作系统—精髓与设计原理》

不必全看,两者任选一本都不错,我自己是仔细看了第二本,因为是我们教材,同时挑着看了现代操作系统部分章节。

这部分看完你应该对下面这些话题有一个清晰认知了:

  • 操作系统由哪些构成
  • 进程的状态、切换、调度
  • 进程间通信方式(共享内存、管道、消息)
  • 进程和线程的区别
  • 线程的实现方式(一对一、多对一等)
  • 互斥与同步(信号量、管程、锁)
  • 死锁检测与避免
  • 并发经典的问题:读者写者、哲学家就餐问题
  • 为什么需要虚拟内存,MMU 具体如何做地址转换的
  • 内存为什么分段、分页
  • 页面置换算法
  • 文件系统是如何组织的
  • 虚拟文件系统(VFS)是如何抽象的
  • ...

但是这还不够,看完偏理论的书,当面试官问「进程和线程的区别」时。

大概只能回答出「进程是资源分配的最小单位,线程是CPU调度的最小单位,balabala...」这样正确却普通的答案。

但是如果你了解 Linux 内核的实现,就可以实际出发,讲讲 Linux 中进程和线程是如何创建的,区别在哪里。

比如在 Linux 中进程和线程实际上都是用一个结构体 task_struct来表示一个执行任务的实体。进程创建调用fork 系统调用,而线程创建则是 pthread_create 方法,但是这两个方法最终都会调用到 do_fork 来做具体的创建操作 ,区别就在于传入的参数不同。

深究下去,你会发现 Linux 实现线程的方式简直太巧妙了,实际上根本没有线程,它创建的就是进程,只不过通过参数指定多个进程之间共享某些资源(如虚拟内存、页表、文件描述符等),函数调用栈、寄存器等线程私有数据则独立。

这样是不是非常符合理论书上的定义:同一进程内的多个线程共享该进程的资源,但线程并不拥有资源,只是使用他们。

这也算符合 Unix 的哲学了— KISS(Keep It Simple, Stupid)。

但是在其它提供了专门线程支持的系统中,则会在进程控制块(PCB)中增加一个包含指向该进程所有线程的指针,然后再每个线程中再去包含自己独占的资源。

这算是非常正统的实现方式了,比如 Windows 就是这样干的。

但是相比之下 Linux 就显得取巧很多,也很简洁。

对于进程、线程这块你还可以把 fork、vfork、clone 、pthread_create 这些模块关系彻底搞清楚,对你理解 Linux 下的进程实现有非常大的帮助。

说了这么多,就是想强调一下理论联系实际的重要性。

特别是操作系统,最好的实践就是看下 Linux 内核是怎么实现的,当然不是叫你直接去啃 Linux 源码,那不是一般人能掌握的。

最好的方式是看书,书的脉络给你理得很清晰。

书籍推荐:

  • 《Linux内核设计与实现》
这本书恰到好处,即讲清楚了内核实现的要点,又不会通篇源码。

这本书重点关注「第 3 章进程管理」、「第 5 章系统调用」、「第12章内存管理」、「第13章虚拟文件系统」、「第 15 章进程地址空间」

这些章节属于操作系统核心部分,其它如中断处理、块 IO、设备管理根据你自己兴趣选择看下就可以了。

基本上做到这里,操作系统就没什么大问题了。

五、计算机网络

需要掌握的网络协议和知识:

  • HTTP、TCP、IP、ICMP、UDP、DNS、ARP
  • IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)
  • HTTPS安全相关的:数字签名、数字证书、TLS
  • 常见网络攻击:局域网ARP泛洪、DDoS、TCP SYN Flood、XSS等

计网知识比较繁杂,很多同学都反映网络很难学,一大堆的网络协议,依次学完后,还是不知道网络是怎么构成的。

这就是没有用对学习方法,导致只见树木,不见森林。

学习时,推荐你抓住一条主线 「一个数据包是如何发送出去的?」

带着这个问题依次去学应用层、传输层、网络层、链路层,思考这些层之间是如何串联起来的。

这就是自顶向下的思路,那自然要推荐:

  • 《计算机网络:自顶向下方法》
这本书从我们最常接触的 HTTP、FTP、SMTP 等应用层协议讲起,可以清晰看到引入各个层的作用。

比如为了区分同一个主机的不用应用,引入了传输层,并使用不用的端口号作为区别;

为了在不同子网间传输数据引入了网络层,并使用 IP 地址寻址路由;

网络层解决了不同子网间路由的问题,但是同一个局域网内确定主机却是通过 MAC 地址,所以引入了链路层来承载 IP 数据包;

同时为了将 IP 地址和 MAC 地址做转换映射又产生了 ARP 协议。

层层递进,逐层揭开网络,非常推荐!

还有一本书:

  • 《网络是怎样连接的》
非常浅显易懂的描述了「一个数据包是如何发送出去的」,也不费时间,看惯了机工社的大黑书,看这种反而有种看小人书的感觉,有基础的话,一天左右就过完了。

只有把握住了整个网络脉络主线才不至于被纷繁复杂的网络协议所搞晕,剩下的就是不断的细化,填充这些主干上的细枝末节。

那么有哪些细节可以去填充呢?

比如 ARP 工作过程、IP 地址、IP 分片、NAT(UDP 打洞)、链路层访问控制协议等等。

还有最重要的 TCP 协议,TCP 也是面试和计网中最重要的概念:

  • 三次握手、四次挥手
  • 状态转换
  • TCP 状态中 TIME_WAIT
  • 拥塞控制
  • 快速重传、慢启动等

这么多东西肯定需要背,但不要死记,最好带着问题去思考为什么要这样做。

这里列几个问题:

  • TCP 如何实现可靠传输的(画外音:如何基于 UDP 实现可靠传输
  • TCP 连接建立为什么不是两次握手(画外音:三次握手的充分必要性说明
  • TIME_WAIT 的存在解决了什么问题,等待时间为什么是 2 MSL

整个 TCP 的核心就是围绕着 可靠传输 + 高效传输(流量控制和窗口管理)

由于 TCP 的细节实在太多,自顶向下那本书有点不太够,所以你需要去看看:

  • 《TCP/IP详解卷1:协议》
这本书不要从头看,而是挑出其中涉及到 TCP 的章节

到这里,对于整个网络以及 TCP 都应该有了一个全面而细致的认识。

但是计网中还是有一些有意思的问题,如果你没思考过,也许回答不出来。

比如:

  • 为什么有了 MAC 地址还要 IP 地址,IP 地址和 MAC 地址的区别是什么?
  • 如何理解广播域和冲突域?
  • 路由器和交换机有什么区别?
  • TCP 连接的本质是什么,真的是“链接”吗?(曾经被问过:Java socket 创建的 TCP 连接,对于主机挂了和 JVM 挂了有什么区别?

这些问题只有当你真正理解了才能回答出,仅仅记住协议的话,估计很难应对灵活的面试题。

此外,网络部分还需要准备 HTTP、HTTPS,推荐:

  • 《图解HTTP》

最后别忘了自己回答一遍那被问烂了、写烂了的问题:

  • 从 URL 输入到页面展现到底发生什么

越细越好,五百字以上吧,哈哈哈

六、网络编程

C++ 后台开发基本是离不开网络编程的,其实甚至整个后台开发也可以看做是在做网络编程。

只不过别人的框架帮我们做了协议解析、网络数据传输、解封包这些底层操作。

比如 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以至于我们开发业务只需要定义接收和返回包的数据格式,然后做逻辑处理就完了。

像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到。

但是网络编程技能还是很重要的,特别是对于 Linux C++ 开发来说。

Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:

  • 进程间通信方式: 信号量、管道、共享内存、socket 等
  • 多线程编程:互斥锁、条件变量、读写锁、线程池等
  • 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
  • 高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
  • IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)

推荐的书:

  • 《Unix网络编程》
  • 《Unix环境高级编程》
这两本是砖头书,虽然是网络编程和 Unix 系统编程方面的无出其右的圣经,但主要用途还是垫显示器(逃, 个人觉得这种书不是面向读者的,具体原因和如何阅读这种书在后文介绍。
  • 《Linux高性能服务器编程》
我强烈推荐,这本书前半部分基本是在重复计网基础知识,但是后面几章关于高性能服务器程序框架、高性能IO、IO复用、定时器、多线程编程、线程池和进程池还是讲得非常全面到位的,值得一看,看完基本上对于整个网络编程就有了框架。
  • 《Linux多线程服务器端编程》
这本书同样强烈推荐,这是陈硕大佬写的书,说实话第一部分:C++ 多线程系统编程都直接把我看蒙了,没有想到 C++ 里要做到线程安全这么难,第一章我看了两三遍才看懂吧。。。 这是难得的讲解 C++ 多线程编程的书。

并且在书中,陈硕大佬用了一章讲解了 Muduo 网络库设计与实现,Muduo 比较适合学完基础的网络编程后继续进阶学习如何设计和写一个网络库,是一个高质量的 Reactor 网络库,采用 one loop per thread + thread pool 实现,代码比较简洁,书和源码搭配着看作为学习网络编程方面来说是非常不错。

学完网络编程就可以写点小项目练手了,这里列举几个项目:

  • HTTP 服务器,这个似乎成了 Linux C/C++ 人手一个的项目了? 这里推荐两个做为参考: https://github.com/imarvinle/WebServer: 这是我看完高性能服务器编程后写的 https://github.com/linyacool/WebServer :这是牛客 linya 大佬写的 不过 HTTP 服务器看着挺简单的,但是可以扩展写的地方还是挺多的,比如可以加入代理功能,这部分我在留学生 lab 中写过,但是没有集成到这个里面来,可以加入日志库,可以添加 CGI 支持等等。
  • 网络库 这个也算是造轮子了, 可以就采用 one loop per thread + thread pool 这种模式,先去看懂 Muduo 源码,然后自己再写一个类似的,这个过程就算是抄,你也可以学到不少东西的,学编程不就是这样先看,再模仿、修改,然后创新吗?
  • RPC 写一个 PRC 你需要考虑到序列化、网络传输、服务发现等,比较有名的有 grpc、brpc,这两个网上文档都比较完善,可以学习一下实现原理。 这里还有一个简单版本的:https://github.com/guangqianpeng/jrpc
  • 类似QQ的网络聊天室 简单版的就可以直接在局域网内实现群聊、单聊等。 更进一步可以考虑一下如何不通过服务器中转消息实现 P2P 聊天,类似 QQ,这里会涉及到 UDP 打洞、NAT 转换等知识,还是很有意思的,我大二用 Java 搞过。

七、系统级编程

作为 C/C++ 程序员,编写的程序不像 Java、Python 这些是在虚拟机上,直接就是在操作系统上运行,那么就必须了解操作系统底层机制和运行原理。

就和 Java 程序员要求了解 JVM 是一个道理,你得熟悉代码运行的平台,才能在出问题的时候准确定位到。

这个也是在我们学校在大三开设的一门课程《System Programing》,从 CMU 引进的,教材也是沿用 CSAPP,这也是我觉得大学上过最值的课了。

我重新认真读 CSAPP 就是在大三上这个课期间,包括做了每个章节附带的 lab, 这是我当时做 Bomblab 的题解:

https://www.jianshu.com/p/479333cbccc4

这里推荐两本书:

  • 《深入理解计算机系统》
不需要我多介绍了
  • 《程序员自我修养》
别被名字欺骗了,这不是教你养生的,而是学了会掉头发的硬核知识

两本书侧重点各不相同,CSAPP 非常巧妙的把数字电路基础、二进制与指令集体系、汇编语言、程序设计及优化、存储器体系结构、链接与装载、进程、虚拟内存这一堆来自各不同的计算机学科的核心知识点串在一起,并以程序员的视角呈现,所以这本书的英文名字叫《Computer Systems A Programmer's perspective》。

而程序员自我修养则重在链接、目标文件、装载、库与运行时,看完这本书你会了解到一个 C/C++ 程序是如何被编译成目标文件的,以及 Linux 下目标文件的格式,不同目标文件又是如何被链接成一个可执行程序,在链接时如何处理符号、重定位、地址解析等,以及静态链接、动态链接区别等等,最后可执行文件又是如何被加载进内存,如何和虚拟内存空间映射的。

你可能会觉得这个又是只能用于面试,实际派不上用场的知识?

那简直大错特错,说真的,这两本书,我是反复看了三遍以上,当然后续看都是挑着重点看的。

举个例子吧,写 C/C++ 的同学没少遇到这些编译错误吧:

undefined reference to xxx

Symbol key multiply defined (by xxx.o and yyy.o)

在我大一的时候遇到这些问题简直一脸懵逼,根本连报错都看不懂。

特别是涉及到多文件编程的时候,经常傻乎乎的在头文件中定义变量,导致变量多重定义,这些问题没有学过链接知识的其实很难理解。

在实际编程也是经常会遇到的。

又比如extern、static 这些关键字是如何在编译链接时起作用,变量的申明与定义又有什么区别?

这部分可以算是真正的内功了,提升你对计算机系统的理解,也有助于解决实际编程过程中会出现的问题,当然也会在面试中出现。

八、数据库

数据库首先要学会 SQL 的使用,这里推荐《MySQL必知必会》。

数据库原理方面可以看看《数据库系统概念》,这本书挺厚的,包含了从 SQL 到数据库设计再到数据库原理、分布式数据库都有,可以挑着看,比如关系模型、数据库设计(三大范式)、数据磁盘存储和组织方式、索引、并发控制等。

当然了整个数据库最重要的还是索引和并发控制(锁、MVCC等),这部分也是面试常考的:

  • 索引存储结构:B树、B+树索引、Hash索引
  • 索引的使用:主键索引、覆盖索引、最左前缀原则、索引下推等
  • 锁:乐观锁、悲观锁、表锁,行锁,意向锁,读锁,写锁等等
  • MySQL InnoDB MVCC 实现机制
  • 存储引擎:InnoDB、MyISAM等,各自的优缺点
  • 事务:ACID理论

这部分推荐两本书:

  • 《高性能MySQL》
  • 《MySQL技术内幕》
这两本主要对索引、innodb存储引擎、锁、并发控制讲得比较清楚,建议挑对应章节看。

九、算法和数据结构

首先需要掌握常见的数据结构:

  • 线性表、数组、链表
  • 栈与队列
  • 树、二叉树、多叉树实现和遍历方式,AVL树实现以及插入删除过程、红黑树(了解定义即可)
  • 图,以及图的实现方式、遍历
  • B树、B+树
  • 散列函数和散列表

常见的算法:

  • 排序算法:冒泡、插入、快速、希尔、堆排、基数、归并等
  • 字符串匹配算法:KMP
  • 常见算法思想:递归、枚举、递推、分治、贪心、动态规划等

视频可以看看 :

  • mooc 上浙大的《数据结构》
  • 学堂在线上清华邓俊辉老师的《数据结构与算法》

这两个是我看过觉得不错的才在这推荐,第一个是初学数据结构时跟着看,第二个是大三复习时刷的。

入门版书籍可以看看:

  • 《啊哈算法》
  • 《算法图解》

稍微进阶点的:

  • 《算法第四版》
这本书强烈推荐,难度适中,但是全面。

终极版:

  • 《算法导论》
这个量力而行就好了。。。 推荐理由是:我不推荐显得没有逼格(:

有了基础的算法思想和数据结构储备,剩下的就是刷题了:

  • 《剑指offer》
建议必刷
  • leetcode
建议分类刷,先易后难,比如数组、二分、二叉树、动态规划,一个一个系列搞定,总结经验,保证 150 道简单和中等以上吧

最重要的是,保持手感,有空就刷一道。

十、网站和视频

有些同学喜欢看视频,那我也在这里统一推荐一下吧

  • B站
你的一站式学习网站,用你想学的关键字在这搜就完了
  • 中国大学 mooc
基础课程学习
  • 网易云课程、学堂在线
一些技术课程、公开课学习

Linux C/C++ 可以去看看黑马的,我试看过几集 IO,讲得还是不错的,就是有点慢,个人觉得不如看书。

刷题可以看看牛客左神的视频

计算机网络可以看看 B 站韩立刚或者 mooc 哈工大的

操作系统可以看看学堂在线上清华的《操作系统》

推荐了这么多书,从哪看起?

一、浅谈学习方法

如果你认真看过我前面介绍每一部分的学习路线时,可以发现我特别强调学习抓主线,并且将每一个基础知识的主线给大家列出来了。

这里再次强推,学习新东西的时候,重点是先对整体脉络、知识结构有一个大概的映像和了解,然后抓住这个领域的主线,顺着主干,突出重点去学习。

集中时间,速战速决,不要将时间线拉得太长,越长可能越坚持不下去,效果越差。

对于细枝末节的内容,可以留到实践的时候,用到了再去查!

如果一头扎进零碎的知识,去看手册、字典型的书,那必然是事倍功半的。

细节留给实践去补充,我们的时间要花在刀刃上,注重知识的体系性和框架的建立。

二、常见问题

说实话,其实这些书籍或多或少都被各路大神推荐过,确实经典。但是大神们却很少告诉你他们是如何去看的,该怎么去看这些书,难道一本本一页页的挨着啃吗?

这部分才是我今天最想说的部分,「该如何去看大厚书」。

比如我后台就经常有同学问:

  • 有些书看的找不到重点,看不下去了,怎么办,比如深入理解计算机系统,UNIX 网络编程,APUE,求指教
  • 我不是科班 CSAPP 可能不是全部看得懂,该怎么办?
  • 大佬,这么多书看得完吗?
  • 刚开始看这些书很痛苦怎么办?

这些书该怎么看,可能过来人,准备过秋招的都比较清楚,但是作为还在大二、大三的会比较懵逼。

就拿我当时亲身经历来说,在网上搜网络编程如何学习,很多人都推荐 UNP、APUE。

好嘛,买来看,从第一页挨着挨着看,而且书中的示例代码我大部分也照着敲了,最后看了七八章,发现始终是在学一些 socket api 和 系统 api 的用法,没摸到网络编程的框架思维。

后面我又去搜,看到有人推荐《Linux高性能服务器编程》,去豆瓣看了下了目录,似乎正是我想要的东西。

直接找来 PDF 开始看,果然这本书才真正让我理解了网络编程的整个套路和框架,学到了各种事件处理模式、计时器、信号处理、线程池这些网络编程中很重要的东西。

当然 UNP 和 APUE 也是不能丢的,这两本书我当做了字典查询,比如学到了 IO 部分,回去看 UNP 中关于五种 IO 模型的介绍。

用到 connect、listen、bind 这些函数,再回去看 UNP 第四章,不得不说,UNP 关于这些 socket API 的使用和各种异常情况的处理方式都介绍得非常详细和深入,不愧是网络编程领域的圣经。

但是初学者看却容易在细节中迷失,抓不到纲领,这也是这类书的缺点。

类似 UNP、APUE 这种书本身是面向知识体系的,而不是面向读者,它们其实更像字典,把这个领域内的所有知识,非常细致的堆叠在一起,看上去就是平铺直叙,充斥着细节,对读者极其不友好。并且书里内容实在大而全,很多根本不用学。

比如 UNP 讲了 sctp 这种协议用法、多播、unix 域协议这些实际用得很少的东西,挨着看不仅会看不下去,而且比较浪费时间。

但是它们又是经典的,确实是这些领域内在体系性和深入性上都做得非常好的书。

什么书才是面向读者的呢?

那就是抓住该领域的核心主干,提纲挈领,带领读者由浅入深,同时又有一定的细节,看完让人茅塞顿开。

比如《自顶向下》、《Linux高性能服务器编程》、《Linux多线程服务端编程》、《STL源码剖析》、《Effective C++》、《CSAPP》、《程序员自我修养》等都有各自想要论述的主线在里面,看起来也是一环扣一环,非常循序渐进。

我的看书方法就是对于面向知识体系那种堆砌细节的书,我们先浏览目录,做到对整本书有映像,再大致看一些我们关心的部分,比如 UNP 和 APUE 中 IO、文件、进程控制、信号、线程、线程控制、基本套接字编程 这些是比较重要的模块,其它边角知识,可以用到再去查。

还有一点,很多同学反映看不懂类似 CSAPP 这样的书,那我们都知道,任何一本书基本上都是有前置依赖的。

没有掌握要求的背景知识去看肯定很吃力的。

就比如我大一下只有基础的 C 知识和一丁点计算机导论知识,然后屁颠屁颠的跑去看 CSAPP(学长毕业摆地摊卖书我瞎买的),那时候只知道这本书被誉为神书,但是看到前两三章就蒙了,真的有点难,对于当时的我来说太底层了,根本不知道在说啥,看过也只是看过,就像天空飞过鸟儿,但没有痕迹。

直到后来大三再次拿起,我才意识到这本书的伟大之处就在于将计算机不同学科知识有机的串在了一起。那时候看,更多是一种补充、深入学习以及完善了,因为很多知识分别在数字逻辑、汇编语言、操作系统这些课程中学过了。

所以要明白,你看不懂不是因为你笨没天赋,而是你有前置依赖的知识没有完成,还没学会走,就想跑了。

一般来说,每本书的首页会介绍看这本书需要哪些前置知识,可以关注一下。

还有一种看书的方法,我在复习的时候采用过,那就是横向学习。

比如我复习操作系统,在《操作系统:精髓和设计原理》中看到了关于内存、虚拟内存的各种介绍,看完理论再去看《Linux内核设计与实现》12 章「虚拟内存」、15 章『进程地址空间』,最后再去看《CSAPP》第 9 章『虚拟内存』,这样看下来,基本上内存这块理解得比较透了,这些书关于这块的介绍是各有优缺点的,正好互补。

又比如在《精髓与设计原理》中介绍了进程加载和链接,其实讲得比较偏理论,看完还是觉得似懂非懂。

那我又会去《CSAPP》看第 7 章「链接」,这一章基本讲清了静态链接、目标文件、可重定位目标文件、引用解析、加载这些关于链接的核心概念,但是一个章节讲这么多,难免不够深入。

我又会去看《程序员自我修养》这本书第 4 章「静态链接」、第 6 章 「可执行文件的装载与进程」、第 7 章 「动态链接」,这本书核心主题就是链接、加载,所以这一路看下来,对于链接、加载这块基本上搞得比较透彻了,也许没几个面试官有你清楚。

同样索引你也能从《数据库系统概念》、《高性能MySQL》、《MySQL技术内幕》中挑选对应的章节,串起来看,取每本书优点,这样学习真的很高效也很深入。

这就是我在复习的时候采用的用知识点串联,跨多本书高效精准的复习方式,效果也很不错,春招十几次面试没有一次因为这些基础知识挂过。

啰嗦了一大堆,就是回答这些问题的:

“有些书看的找不到重点,看不下去了,怎么办,比如深入理解计算机系统,UNIX 网络编程,APUE,求指教”、“我不是科班 CSAPP 可能不是全部看得懂,该怎么办?”、“大佬,这么多书看得完吗”、“刚开始看这些书很痛苦怎么办”

三、要花多久时间才能学完

这个不好说,根据你的基础和学习效率不同,比如我大一、大二对于一些基础的知识学得比较认真,基础还算可以,按照这样一套走下来也就大半年。大概每天花四五个小时以上吧。

如果真的是连计网、操作系统理论这样的东西一点基础都没的话,那估计得一年以上,毕竟这些内容基本覆盖了科班的核心课程,人家上三年课,你一年解决,已经算很快了好吧。

一年真的足够从小白学起吗?

感觉是差不太多的,但是估计得每天付出五六小时以上了,并且学习方法得当。

你去牛客就会发现,存在各路大三、研一自学转码的同学,最后还能成为 offer 收割机,所以,不要怀疑一年不够,最关键的是你要找到正确的路线,然后执行下去。

文中推荐的书真的全部要看吗?

当然不是,我自己都没看完,但是我的策略已经说过了,基本上大部分书都看了重要的章节,这样看起来是很快的。

并且随着你看书越来越多,基础越来越好,你会发现每本书前面几章都是铺垫基础知识,大部分可以直接跳过,举个例子

《Linux高性能服务器编程》这本书前几章是这样的:

  • 第1章 TCPIP协议族
  • 第2章 IP协议详解
  • 第3章 TCP协议详解
  • 第四章 TCPIP通信案例:访问Internet上的Web服务器
  • 第五章 Linux网络编程基础API

你觉得这些章节在看过《自顶向下》、《TCP/IP详解》之后还有必要看吗?我反正是半天扫过去就完了。

最后,不管说再多方法,再多的路线,最终都需要自己花时间去啃、去执行。

四、语言疑惑

还有一个很多选择 C++ 方向同学都存在的疑惑,在这里我也想解释一下:

C++ 语言特性多,又难学,很多都是底层开发才会用到,C++ 就是个坑,是否应该转 Java、Go 呢?

当然不是的,的确在头条、美团、阿里这种业务部门使用 Go、Java 系更多,首先还是那个观点,校招生对于企业来说都是一张白纸,面试官考察的是你的基础知识和聪明度,来决定是否有培养潜力,语言确实不重要。

那你可能会说,明明各种面经上常常出现 ConcurrentHashMap、虚表、虚函数实现机制这样和语言强相关的问题。

在我看来啊,面试深入问一些语言实现细节,其实不是在考你语言,而是看你是否有主动钻研的意识,是不是只停留在应用的层面,同时也借语言考察一些数据结构、操作系统方面的基础知识。

所以呢,我觉得 C/C++、Java、Go 你深入学习哪一个都可以,关键还是找对相应的学习路线,一直坚持学下去,不要每天都停留在我到底是学 Java 好还是 C++ 好这样无解的问题。

另外,想对学 C++ 的同学说,可能你会发现身边同学都在搞 Java、Go之类的,找工作缺少一些一起复习准备的朋友,有些甚至劝你别学 C++。那这个时候你一定要坚定自己的选择,多在牛客或者网上找找同方向的朋友一起交流、学习。

说实话,就找工作这块来说,个人觉得区别真的是不大的,不管从薪资、面试难度来说都是差不太多,更多的还是算法和基础知识。

而且也有不少同学 Java 进腾讯需要转 C++,C++ 进阿里、美团需要转 Java 的,这都不是事儿。

那 C++ 目前应用场景有哪些呢?

一句话,对性能或者执行效率要求比较高的应用,比如游戏引擎、infra、推荐引擎、存储等,当然也能拿来写业务(没错说的就是鹅厂),也有做 C++ 客户端开发的,主要是 MFC、QT 等。

说实话,像游戏引擎、infra这类都是门槛比较高的,并且招聘的数量也有限,一般人很难进,而且目前互联网公司的业务部门大多使用的是 Java、Go这类语言。

所以 C++ 的需求量是相比 Java、Go这类少很多的,但是同时学习 C++ 也没 Java 那么多,所以相对来说竞争还没那么大,并且 C++ 学的不错,你同样可以去面阿里、美团这种 Java 技术栈的公司,大厂基本不会限制语言的。

这里给一份我的面经和刷题笔记, 包含各大厂Java、C++ 等面经, 看完一定有帮助:

pdf都可以在这个开源仓库进行下载:

https://github.com/imarvinle/awesome-cs-books

------update-----

这里有一份现代C++必学书单推荐:

编程指北:想学好 C++,这些书你必须知道 | C++学习路线

此外,面试中算法也非常重要,所以在这里也推荐一份谷歌大佬总结的刷题笔记:

编程指北:看完谷歌大佬的刷题笔记, 我直接手撕了200道 Leetcode 算法题

还有另外一个谷歌大佬也出了一本,很棒:

编程指北:看完这本谷歌师兄的刷题笔记,直接秒杀了 200 道 LeetCode 算法题

END

上面文章有所删减,全文可以看看这里:

万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线

最后再给大家分享下我整理的这些书,可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统

书单:书单推荐,少即是多(含下载方式)

这篇文章有点长,一下子可能一下子看不完,大家可以先收藏着,码字太累了,收藏的时候也请来一个素质三连哦~

九、图片无法上传到服务器上

图片无法上传到服务器上?解决方法分享

在当今数字化时代,图片是我们生活和工作中不可或缺的一部分。无论是在社交媒体上分享照片,还是在网站上展示产品图片,我们都经常需要上传图片至服务器。然而,有时我们可能会遇到图片无法上传到服务器上的问题。这不仅令人困惑,还可能对我们的工作和网站运营产生负面影响。在本文中,我们将提供一些解决图片无法上传到服务器上的常见问题和方法。

1. 图片文件格式问题

首先,我们要确保图片文件的格式是被服务器所接受的。常见的图片格式包括JPEG、PNG、GIF等。有些服务器可能不支持某些图片格式,因此在上传之前,建议确认服务器的图片格式要求。

2. 服务器存储空间不足

当我们的服务器存储空间快要满时,可能会导致无法上传新的图片。这种情况下,我们可以通过以下方法解决:

  • 删除一些不再需要的旧图片,以释放更多存储空间。
  • 将图片上传至云存储服务,例如Google Drive或Dropbox,并在网站上使用外部链接。
  • 联系服务器管理员,了解如何扩展存储空间。

3. 文件上传大小限制

服务器通常会设置文件上传的大小限制。如果我们尝试上传的图片大小超过了服务器限制,那么可能会导致上传失败。我们应该确保上传的图片大小符合服务器的要求。如果需要上传大型图片,可以尝试进行压缩或调整尺寸以符合服务器限制。

4. 网络连接问题

有时,图片上传失败可能是由于网络连接问题造成的。检查我们的网络连接是否稳定,并尝试重新上传图片。

5. 权限设置问题

服务器上的文件权限设置可能会影响图片上传。确保我们具有足够的权限来上传文件。如果我们使用的是共享服务器,联系服务器管理员以了解文件上传权限的设置。

6. 图片命名冲突

如果我们尝试上传的图片与服务器上已存在的图片文件名相同,可能会导致命名冲突,从而无法上传。我们可以尝试更改图片文件名,确保唯一性,并再次尝试上传。

7. 服务器故障

虽然不常见,但服务器故障可能导致图片无法上传。在这种情况下,只能等待服务器问题修复。如果故障持续时间过长,建议联系服务器管理员寻求帮助。

总结

图片无法上传到服务器上是一个常见但令人沮丧的问题。在解决这个问题之前,我们应该先排除可能的原因,例如文件格式、存储空间、文件大小、网络连接、权限设置和命名冲突。通过仔细检查和尝试解决这些问题,很可能能够成功将图片上传至服务器。如果所有方法都尝试过后仍然无法解决,我们建议联系服务器管理员以获取进一步的帮助。

十、如何将电脑上的照片轻松传到iPhone上

在数字时代,我们的生活中充满了各种电子设备,从电脑到手机,再到平板电脑等等。这些设备都能帮助我们更好地记录生活,捕捉美好的瞬间。但是,当我们想要将电脑上的照片传到iPhone上时,却常常会遇到一些问题。今天,我们就来探讨一下如何将电脑上的照片轻松传到iPhone上。

1. 使用iCloud同步照片

iCloud是苹果公司提供的一项云存储服务,它可以帮助我们在不同设备之间同步照片、文件等数据。要使用iCloud同步照片,首先需要在电脑和iPhone上都登录同一个iCloud账号,然后在设置中开启"照片"的同步功能。这样,电脑上的照片就会自动上传到iCloud,然后同步到iPhone上。这种方式操作简单,而且可以确保照片的安全性。

2. 使用iTunes同步照片

除了iCloud,我们还可以使用iTunes来同步电脑和iPhone上的照片。首先,需要将iPhone连接到电脑上,然后打开iTunes。在iTunes中,找到"照片"选项卡,勾选"同步照片",并选择要同步的相册或文件夹。这样,电脑上的照片就会自动传输到iPhone上。这种方式操作相对复杂一些,但是可以更精细地控制同步的内容。

3. 使用第三方应用程序

除了以上两种方式,我们还可以使用一些第三方应用程序来实现电脑和iPhone之间的照片传输。比如Google相册Dropbox等,这些应用程序都提供了跨设备同步照片的功能。我们只需要在电脑和iPhone上都安装这些应用程序,然后将照片上传到云端,就可以在不同设备上查看和管理这些照片了。这种方式操作灵活,但需要注意数据的安全性。

总之,将电脑上的照片传到iPhone上有多种方式可以选择,每种方式都有自己的优缺点。我们可以根据自己的需求和习惯,选择最适合自己的方式。无论采用哪种方式,都要注意照片的安全性和备份,以免丢失宝贵的照片。希望这篇文章对您有所帮助,祝您生活愉快,照片拍摄精彩!

ibm x3100如何设置u盘引导?
DELL R710怎么安装系统?
相关文章