【网络篇】第十一篇——简单的TCP英译汉服务器

简介: 【网络篇】第十一篇——简单的TCP英译汉服务器
+关注继续查看

在前面几篇博客实现了简单的TCP服务器,最开始我们实现的是单执行流的TCP服务器,之后通过代码测试发现单执行流的TCP服务器无法同时为多个客户端提供服务,于是又转而实现了多执行流的TCP服务器。


在实现多执行流的TCP服务器时,分别演示了多进程和多线程的实现方式,为了进一步优化基于多线程的TCP服务器,最终还将线程池接入到了TCP服务器当中。此时访问TCP服务器的各个客户端,分别由不同的执行流为其提供服务,因此这些客户端能够同时享受服务器提供的服务。


当时我们说过,如果想要让这里的TCP服务器处理其他任务,只需要修改对应的处理函数即可。对应到最终实现的线程池版本的TCP服务器,我们要修改的其实就只是任务类当中的handler方法。下面我们以实现简单的TCP英译汉服务器为例,看看更改后我们的TCP服务器能否正常为客户端提供英译汉服务。

英译汉TCP服务器要做的就是,根据客户端发来的英文单词找到其对应的中文意思,然后将该中文意思作为响应数据发给客户端。

之前我们是以回调的方式处理任务的,当线程池当中的线程从任务队列中拿出一个任务后,会调用该任务对应的Run方法处理该任务,而实际在这个Run方法当中会以仿函数的方式调用handler方法,因此我们只需更改Handler类当中对()的重载函数即可,而其他与通信相关的代码我们一律不用更改。


英译汉时需要根据英文单词找到其对应的中文意思,因此我们需要建立一张映射表,其中英文单词作为映射表中的键值key,而中文意思作为与键值相对应的value,这里可以直接使用C++STL容器当中的unordered_map容器。需要看完整代码的可以关注这个系列的博客。

class Handler
{
public:
    Handler()
    {}
    ~Handler()
    {}
    void operator()(int sock, std::string client_ip, int client_port)
    {
        //only for test
        std::unordered_map<std::string, std::string> dict;
        dict.insert(std::make_pair("blog", "博客"));
        dict.insert(std::make_pair("socket", "套接字"));
        
        char buffer[1024];
        std::string value;
        while (true){
            ssize_t size = read(sock, buffer, sizeof(buffer)-1);
            if (size > 0){ //读取成功
                buffer[size] = '\0';
                std::cout << client_ip << ":" << client_port << "# " << buffer << std::endl;
 
                std::string key = buffer;
                auto it = dict.find(key);
                if (it != dict.end()){
                    value = it->second;
                }
                else{
                    value = key;
                }
                write(sock, value.c_str(), value.size());
            }
            else if (size == 0){ //对端关闭连接
                std::cout << client_ip << ":" << client_port << " close!" << std::endl;
                break;
            }
            else{ //读取失败
                std::cerr << sock << " read error!" << std::endl;
                break;
            }
        }
        close(sock); //归还文件描述符
        std::cout << client_ip << ":" << client_port << " service done!" << std::endl;
    }
};

说明一下:

  • 这里只是测试更改后的服务器能否为客户端提供英译汉服务,因此直接将这张映射表定义在了()重载函数当中。
  • 初始化这张映射表对应的操作,就是建立单词与其中文意思之间的映射关系,代码中为了测试只简单建立了三组映射关系。此外,初始化映射表的操作应该重新封装出一个初始化函数,否则每次为客户端提供英译汉服务时都会重新建立映射关系。
  • 如果你自己要实现一个英译汉服务器,应该将这张映射表定义为静态,保证全局只有一张映射表,在启动服务器时就可以对这张映射表进行初始化。可以将中英文对照单独写在一个文件当中,在启动服务器时就可以将该文件加载进来,建立对应的映射关系。(这里我们只是做测试的,就不做过多的设计了)
  • 当服务端在为客户端提供英译汉服务时,如果在映射表中不存在对应key值的键值对,则服务端会直接将用户发来的数据响应给客户端。

代码测试

现在这个TCP服务器就能够给客户端提供英译汉的服务了,客户端发来的单词如果能够在映射表当中找到,那么服务端会将该单词对应发中文意思响应给客户端,否则会将客户端发来的单词原封不动的响应给客户端。

image.png

 注意: 这里只是想告诉大家,我们可以通过改变这里的handler方法来改变服务器处理任务的逻辑。如果你还想对当前这个英译汉服务器进行完善,可以在网上找一找牛津词典对应的文件,将其中单词和中文的翻译做出kv的映射关系,当服务器启动的时候就可以加载这个文件,建立对应的映射关系,此时就完成了一个网络版的英译汉服务器。

相关文章
|
11月前
|
网络协议 Java C++
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
|
11月前
|
存储 网络协议 数据格式
TCP网络编程模型从入门到实战基础篇,单服务器单个用户非并发版本
TCP网络编程模型从入门到实战基础篇,单服务器单个用户非并发版本
TCP网络编程模型从入门到实战基础篇,单服务器单个用户非并发版本
|
12月前
|
网络协议 Unix Linux
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
216 0
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
|
12月前
|
机器学习/深度学习 网络协议 机器人
socket库:Python实现TCP/IP客户和服务器通信
socket库:Python实现TCP/IP客户和服务器通信
329 0
socket库:Python实现TCP/IP客户和服务器通信
|
12月前
|
消息中间件 网络协议 Linux
php实现tcp服务器
php实现tcp服务器
214 0
php实现tcp服务器
|
12月前
|
网络协议
精简TCP服务器
精简TCP服务器
83 0
|
网络协议 Java 物联网
Wifi-nodeMCU-esp8266tcp 服务器创建并通过 tcp 调试助手远程控制 LED | 学习笔记
快速学习 Wifi-nodeMCU-esp8266tcp 服务器创建并通过 tcp 调试助手远程控制 LED
402 0
Wifi-nodeMCU-esp8266tcp 服务器创建并通过 tcp 调试助手远程控制 LED | 学习笔记
|
网络协议 物联网 UED
Wifi-nodeMCU-esp8266 TCP 服务器远程控制家里的灯 | 学习笔记
快速学习 Wifi-nodeMCU-esp8266 TCP 服务器远程控制家里的灯
155 0
Wifi-nodeMCU-esp8266 TCP 服务器远程控制家里的灯 | 学习笔记
|
存储 网络协议
netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器
在前面的文章中,我们提到了使用netty构建tcp和udp的客户端向已经公布的DNS服务器进行域名请求服务。基本的流程是借助于netty本身的NIO通道,将要查询的信息封装成为DNSMessage,通过netty搭建的channel发送到服务器端,然后从服务器端接受返回数据,将其编码为DNSResponse,进行消息的处理。
|
网络协议 开发者 Python
Tcp 服务器 | 学习笔记
快速学习 Tcp 服务器
327 0
相关产品
云迁移中心
推荐文章
更多