wifi 万能钥匙面试题目
1 . 使用linux c++,实现一个client和server,要求对功能做一些简单的封装,设计成几个简单的类,使用Makefile进行依赖管理;
2 . client使用连接池技术管理与服务器的通信,主线程间隔1s从连接池中取到一个连接,发送到server端,请求的格式为json,其中只有一个key为id;
3 . server使用epoll+多线程进行设计,工作线程取到client的请求后,响应一段protobuf格式的内容,形如:value:xxx,其中,xxx的值为id+1;
4 . client读到响应后,将响应的内容反序列化,并打印到日志文件,日志格式自定义(日志库可以使用开源的,如果没用过的话,可以网上了解);
5 . client和server相关的配置通过配置文件进行设计,配置文件可以是纯文本形式,也可以是json格式。
通过这道题目可以很好的训练自己的基于Linux的C++服务器编程功底,本人因为是嵌入式出身,但一直想转型互联网的Linux C++服务器方向,因为没有相关经验,所以当时面试官先拿了这道题来考考自己的快速学习能力,如果你也想试一试自己的水平,不防可以试一试。
本人花了一天的时间写出了程序的初稿,给出了完成实现,具体是研究了该小项目需要利用的相关技术(比如:socket多线程编程,socket连接池,epoll机制,Json序列化及反序列化,protobuf序列化与反序列化,日志库等)。由于时间仓促,写出来后,面试官说还是有些小问题,我今天就share我的代码 github上的socket编程小项目,让大家一起来看看,希望能与大家共同进步,也希望大牛们能提出自己的见解,给出自己的完整实现。
因为之前很少接触这块东西,中途碰到了许多搭建环境及配开源工具的问题,本人用到了如下的开源工具:
- protobuf (google的一种高效且极具兼容性的二进制数据传输、交换格式)
- jsoncpp (json 序列化及反序列化的C++工具,当时我还不知道什么是(反)序列化)
- log4cplus (日志比较全面的C++开源工具)
需要先安装这些工具,具体安装过程可以参见其他网上,这里就是jsoncpp安装稍需注意,请参见jsoncpp安装方法
现在我列下自己的代码分布情况,源码可以先去我的github上下载。该小项目,总共分为客户端(ClientMain.cpp, ClientSocket.cpp, ConnectionPool.cpp)+服务器端(ServerMain.cpp, ServerSocket.cpp),其中 ClientSocket及ServerSocket皆继承Socket.cpp,代码风格不是很好,朋友们也可以给出自己的建议。
我的运行结果如下:
我说说做该小项目的几点感受:
- 发现互联网的新技术很多很新,是真的很能锻炼人。
- 如果可以重来,我当时应该不会选择传统行业,工作后在转型会比较痛苦。
- 自己是嵌入式出身,如果想转互联网,很多之前学的东西感觉都没什么大的用处,有一种抛弃一切,重新开始的感觉。
- 平时有时间可以多关注互联网技术,特别是些开源的技术。
最后,我附上一个连接,如果有想转型Linux C++ 服务器端开发的同学,可以参考下。
服务器端开发需看书箱