我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用UDP协议实现—翻译服务器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用UDP协议实现—翻译服务器

目录

前言

1.设计思路:

2.词库设计

3.设计客户端

4.设计服务端

5.编译客户端和服务端

6.测试结果

7.总结


前言

        上一篇文章中,我们使用UDP协议编码完成了一个简单的服务器,实现数据通信,服务器设计出来后目的不仅仅只是实现数据通信,而是根据客户端发过来的请求,实现一定的需求,今天我们要介绍的是当客户端给服务端发送英文单词,然后服务端获取客户端的请求,将翻译结果返回给客户端,通过这样的方式,实现了一款英文翻译服务器。下面我们就一起具体来看看是如何编码完成。

1.设计思路:

如图所示

第一步:启动服务器,然后服务器加载词库

第二步:客户端向服务器,发送请求

第三步:服务器处理请求查找单词,将查找结果返回给客户端

第四步:客户端获取查询结果

2.词库设计

说明:在这里只是简单模拟实现一个词库,主要是实现业务逻辑

dict.txt:

aunt:姨母brother:兄弟cousin:堂兄弟couple:夫妇dad:爸爸daughter:女儿family:家father:爸爸grandchild:孙子granddaughger:孙女grandfather:祖父grandma:外婆grandpa:外公granny老奶奶

3.设计客户端

udpClient.hpp

#pragma once#include #include #include #include #include #include #include #include #include #include #include #include namespace Client{    using namespace std;    class udpClient    {    public:        udpClient(const string &serverIp, const uint16_t serverPort)            : _serverIp(serverIp), _serverPort(serverPort), _sockfd(-1) {}        void initClient()        {            _sockfd = socket(AF_INET, SOCK_DGRAM, 0);            if (_sockfd == -1)            {                cerr << "socket error:" << errno << strerror(errno) << endl;                exit(2);            }        }        void run()        {            struct sockaddr_in server;            memset(&server, 0, sizeof(server));            server.sin_family = AF_INET;            server.sin_addr.s_addr = inet_addr(_serverIp.c_str());            server.sin_port = htons(_serverPort);            while (1)            {                string message;                cout << "请输入你想要翻译的单词:";                getline(cin,message);                //发送请求                sendto(_sockfd, message.c_str(), message.size(), 0, (const struct sockaddr *)&server, sizeof(server));                char buffer[1024];                struct sockaddr_in temp;                socklen_t len = sizeof(temp);                //接受查询翻译结果                size_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&temp, &len);                if (n >= 0)                    buffer[n] = 0;                cout << "翻译的结果为: " << buffer << endl;            }        }    private:        string _serverIp;        int _sockfd;        uint16_t _serverPort;    };}

udpClient.cc:启动客户端

#include"udpClient.hpp"#includeusing namespace Client;static void Usage(string proc){    cout << "\nUsage:\n\t" << proc << " server_ip server_port\n\n";}int main(int argc,char* argv[]){    if(argc != 3)    {        Usage(argv[0]);        exit(1);    }    string serverip = argv[1];    uint16_t serverport = atoi(argv[2]);    unique_ptr uct(new udpClient(serverip,serverport));    uct->initClient();    uct->run();    return 0;}

4.设计服务端

udpServer.hpp

#pragma once#include #include #include #include #include #include #include #include #include #include #include #include namespace Server{    using namespace std;    const static string defaultIP = "0.0.0.0";    enum {USAGE_ERR = 1, SOCKET_ERR, BIND_ERR,OPEN_ERR};    typedef function func_t;    class udpServer    {    public:        udpServer(const func_t& cb,uint16_t port, const string &ip = defaultIP)         :_callback(cb),_port(port),_ip(ip),_sockfd(-1)        {}        void initServer()        {            _sockfd = socket(AF_INET,SOCK_DGRAM,0);            if(_sockfd == -1)            {                cerr<<"socket error:" << errno << strerror(errno) << endl;                exit(SOCKET_ERR);            }            struct sockaddr_in local;            bzero(&local,sizeof(local));            local.sin_family = AF_INET;            local.sin_port = htons(_port);            local.sin_addr.s_addr = htonl(INADDR_ANY);            int n = bind(_sockfd,(struct sockaddr*)&local,sizeof(local));            if(n == -1)            {                cerr<<"bind error:" << errno << strerror(errno) << endl;                exit(BIND_ERR);            }        }        void startServer()        {            char buffer[1024];            for(;;)            {                struct sockaddr_in peer;                socklen_t len = sizeof(peer);                ssize_t s = recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);                if(s)                {                    buffer[s] = { 0 };                    string clientIp = inet_ntoa(peer.sin_addr);                    uint16_t clientPort = ntohs(peer.sin_port);                    string message = buffer;                    cout << clientIp << "[" << clientPort << "]" << message << endl;                    //服务器只负责接受数据,处理方法采用回调的方式交给上层处理                    _callback(_sockfd,clientIp,clientPort,message);                }            }        }        ~udpServer()        {}    private:        uint16_t _port;        string _ip;        int _sockfd;        func_t _callback;    };}

udpServer.cc:启动服务端

#include "udpServer.hpp"#include #include #include using namespace Server;static void Usage(string proc){    cout << "\nUsage:\n\t" << proc << " local_port\n\n";}const string DictTxt = "./dict.txt";unordered_map dict;static bool cutString(string& str,string& s1,string& s2,const string& sep){    auto pos = str.find(sep);    if(pos == string::npos)        return false;    s1 = str.substr(0,pos);    s2 = str.substr(pos + sep.size());    return true;}static void initDict(){    ifstream in(DictTxt,ios::binary);    if(!in.is_open())    {        cerr << "open fail:" << DictTxt << "error" << endl;        exit(OPEN_ERR);    }    string line;    string key,value;    while(getline(in,line))    {        if(cutString(line,key,value,":"))        {            dict.insert(make_pair(key,value));        }    }    in.close();    cout << "load dict success" << endl;}//翻译:void TranslationWord(int sockfd,string clientIp,uint16_t clientPort,string message){    string response_message;    auto iter = dict.find(message);    if(iter == dict.end())         response_message = "unknown";    else         response_message = iter->second;    struct sockaddr_in client;    bzero(&client, sizeof(client));    client.sin_family = AF_INET;    client.sin_port = htons(clientPort);    client.sin_addr.s_addr = inet_addr(clientIp.c_str());    sendto(sockfd, response_message.c_str(), response_message.size(), 0, (struct sockaddr*)&client, sizeof(client));}int main(int argc, char *argv[]){    if (argc != 2)    {        Usage(argv[0]);        exit(USAGE_ERR);    }    //加载词库    initDict();    uint16_t port = atoi(argv[1]);    unique_ptr usvr(new udpServer(TranslationWord,port));    usvr->initServer();    usvr->startServer();    return 0;}

5.编译客户端和服务端

makefile:

.PHONY:allall:udpServer udpClientudpServer:udpServer.ccg++ -o $@ $^ -std=c++11udpClient:udpClient.ccg++ -o $@ $^ -std=c++11.PHONY:cleanclean:rm -f udpServer udpClient

6.测试结果

如图所示:服务端能够准确处理客户端的请求,将翻译查询结果返回给客户端

7.总结

         以上就是使用UDP协议实现的一款翻译服务器,细心的小伙伴也已经发现了,在上面的代码中服务器的任务只是接受请求,然后将请求的数据回调处理,让上层处理业务逻辑,这样的实现方式实现了服务器与业务逻辑代码之间的解耦,如果以后想实现一款别的需求的服务器,只需要更改上层的业务逻辑就可以了。

来源地址:https://blog.csdn.net/qq_65307907/article/details/132164347

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用UDP协议实现—翻译服务器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

​Golang 实现客户端与服务器端UDP协议连接通讯

我们先说一下UDP的概念和作用 UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一
2023-06-04

Golang 实现客户端与服务器端UDP协议连接通讯

我们先说一下UDP的概念和作用 UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一
2023-06-05

Android使用http协议与服务器通信的实例

网上介绍Android上http通信的文章很多,不过大部分只给出了实现代码的片段,一些注意事项和如何设计一个合理的类用来处理所有的http请求以及返回结果,一般都不会提及。因此,自己对此做了些总结,给出了我的一个解决方案。 首先,需要明确一
2022-06-06

使用GoogleTranslateIpCheck查找适用谷歌翻译服务器ip,解决谷歌浏览器无法翻译问题

使用GoogleTranslateIpCheck查找适用谷歌翻译服务器ip 参考项目地址操作步骤一、二、三、 验证 参考项目地址 链接: https://github.com/Ponderfly/GoogleTranslat
2023-08-20

JSch中怎么使用sftp协议实现服务器文件上传下载

这篇文章主要介绍了JSch中怎么使用sftp协议实现服务器文件上传下载的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JSch中怎么使用sftp协议实现服务器文件上传下载文章都会有所收获,下面我们一起来看看吧。J
2023-06-29

python使用UDP实现客户端和服务器对话

这篇文章主要为大家介绍了python使用UDP实现客户端和服务器对话示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

服务器使用BGP协议的优势是什么

弹性和可扩展性:BGP协议可以支持多种不同的网络架构和拓扑结构,使其非常适合大规模网络和复杂网络环境。高可靠性:BGP协议具有路由冗余和快速收敛的能力,可以确保网络的高可靠性和稳定性。灵活性:BGP协议支持多种路由策略和路由选择标准,管理员
服务器使用BGP协议的优势是什么
2024-04-20

使用java怎么实现一个英文文本单词翻译器

今天就跟大家聊聊有关使用java怎么实现一个英文文本单词翻译器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。直接上代码:package fanyi;import java.io.Bu
2023-05-31

Python内置的HTTP协议服务器SimpleHTTPServer使用指南

首先确保装了Python,我装的是2.x版本,对了,我的操作系统是WIN7,其实对于Python来说,什么操作系统并不重要。Python内置了一个简单的HTTP服务器,只需要在命令行下面敲一行命令,一个HTTP服务器就起来了:python
2022-06-04

电子邮件服务器使用的协议有哪些

电子邮件服务器使用的协议有:1、SMTP协议,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器;2、POP协议,不支持对服务器邮件进行扩展操作,支持使用ASCII码来传输数据消息;3、IMAP4协议,支持协议客户机在线或离开
2023-02-16

阿里云服务器IP地址使用何种协议?

简介:本文将详细介绍阿里云服务器IP地址使用的协议类型,包括IPv4和IPv6两种协议。一、IPv4和IPv6协议类型IPv4协议IPv4是互联网上最常用的一种协议类型,它主要使用32位的二进制地址来标识网络设备。在全球范围内,IPv4地址已经被分配完毕,这意味着每个设备(包括计算机、服务器等)只能分配一个IPv4地址
阿里云服务器IP地址使用何种协议?
2024-01-26

python如何使用UDP实现客户端和服务器对话

这篇文章主要介绍“python如何使用UDP实现客户端和服务器对话”,在日常操作中,相信很多人在python如何使用UDP实现客户端和服务器对话问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何使
2023-07-05

编程热搜

目录