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

TCP服务器—实现数据通信

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

TCP服务器—实现数据通信

目录

前言

1.接口介绍

2.编写服务器

3.编写客户端

4.编译链接

5.测试

6.总结


前言

        今天我们要介绍的是使用TCP协议实现数据通信,相比于之前写的UDP服务器实现数据信,在主体逻辑上并没有差别。客户端向服务器发送信息,服务器接受信息并回显,因为UDP是面向数据报,而TCP是面向连接的,所以在实现的时候接口上会有一些差别,下面,我们具体来看看UDP和TCP在编码的实现上有什么不同。

1.接口介绍

因为TCP是面向连接的,所以服务器创建完套接字,然后绑定成功后,将套接字设置为监听套接字

服务器启动之后,首先需要根据监听套接字建立连接,建立连接成功后返回一个新的文件描述符,后续的通信都是按照这个新的文件描述符按照读写文件的形式进行读写数据。

对于客户端来说创建完套接字之后,客户端启动之后首先需要建立连接

listen():设置sock为监听状态

 #include         #include  int listen(int sockfd, int backlog);

sockfd:创建套接字的返回值

backlog:底层全连接队列的长度

accept():服务端建立连接

#include          #include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:监听套接字

struct sockaddr* addr:输出型参数,可以获取服务端的IP地址和port端口号

socklen_t* addrlen:结构体的大小

返回值:返回一个新打开的文件描述符

connect():客户端建立连接

#include         #include int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd:创建套接字返回值

struct sockaddr* addr:输出型参数,用来填写需要访问的服务端的IP地址和port端口号

socklen_t addrlen:结构体的大小

2.编写服务器

tcpServer.hpp

#pragma once#include #include #include #include #include #include #include #include #include "log.hpp"namespace server{    using namespace std;    enum    {        USAGE_ERR = 1,        SOCKET_ERR,        BIND_ERR,        LISTEN_ERR    };    static const uint16_t gport = 8080;    static const int gback = 5;    class TcpServer    {    public:        TcpServer(const uint16_t &port = gport)            : _port(gport), _sock(-1)        {}        void InitServer()        {            _sock = socket(AF_INET, SOCK_STREAM, 0);            if (_sock < 0)            {                logMessage(FATAL, "create socket error");                exit(SOCKET_ERR);            }            logMessage(NORMAL, "create socket success");            // 绑定:            struct sockaddr_in local;            local.sin_family = AF_INET;            local.sin_port = htons(_port);            local.sin_addr.s_addr = INADDR_ANY;            if (bind(_sock, (struct sockaddr *)&local, sizeof(local)) < 0)            {                logMessage(FATAL, "bind socket error");                exit(BIND_ERR);            }            logMessage(NORMAL, "bind socket success");            // 设置sock为监听状态:            if (listen(_sock, gback) < 0)            {                logMessage(FATAL, "listen socket error");                exit(LISTEN_ERR);            }            logMessage(NORMAL, "listen socket success");        }        void start()        {            for (;;)            {                // 建立连接:                struct sockaddr_in peer;                socklen_t len = sizeof(peer);                int sock = accept(_sock, (struct sockaddr *)&peer, &len);                 if (sock < 0)                {                    logMessage(ERROR, "accept error, next");                    continue;                }                logMessage(NORMAL, "accept a new link success");                std::cout << "sock: " << sock << std::endl;                //未来通信全部用sock,面向字节流的,后续全部都是文件操作:                serviceIO(sock);                close(sock);            }        }        void serviceIO(int sock)        {            char buffer[1024];            while(true)            {                ssize_t n = read(sock,buffer,sizeof(buffer)-1);                if(n > 0)                {                    buffer[n] = 0;                    cout << "recvice message: " << buffer << endl;                    string outbuffer = buffer;                    outbuffer += "[server echo]";                    write(sock,outbuffer.c_str(),outbuffer.size());                }                else if(n == 0)                {                    // 代表client退出                    logMessage(NORMAL, "client quit, me too!");                    break;                }            }        }        ~TcpServer()        {}    private:        int _sock;        uint16_t _port;    };}

tcpServer.cc:启动服务器

#include"tcpServer.hpp"#includeusing namespace server;static void Usage(string proc){    cout << "\nUsage:\n\t" << proc << " local_port\n\n";}int main(int argc,char* argv[]){    if(argc != 2)    {        Usage(argv[0]);        exit(USAGE_ERR);    }    uint16_t port = atoi(argv[1]);    unique_ptr tcs(new TcpServer(port));    tcs->InitServer();    tcs->start();    return 0;}

3.编写客户端

tcpClient.hpp

#pragma once#include #include #include #include #include #include #include #include namespace client{    using namespace std;    class TcpClient    {    public:        TcpClient(const string& serverip,const uint16_t port)        :_serverip(serverip),_port(port),_sock(-1)        {}        void InitClient()        {            _sock = socket(AF_INET,SOCK_STREAM,0);            if(_sock < 0)            {                cerr << "create sock fail" << endl;                exit(-1);            }        }        void start()        {            //建立连接:            struct sockaddr_in server;            server.sin_family = AF_INET;            server.sin_port = htons(_port);            server.sin_addr.s_addr = inet_addr(_serverip.c_str());            if(connect(_sock,(struct sockaddr*)&server,sizeof(server)) != 0)            {                cerr << "connect fail" << endl;            }            else            {                string message;                while(true)                {                    cout << "Please Enter: ";                    getline(cin,message);                    write(_sock,message.c_str(),message.size());                    char buffer[1024];                    int n = read(_sock,buffer,sizeof(buffer)-1);                    if(n > 0)                    {                        buffer[n] = 0;                        cout << "Server回复: " << buffer << endl;                    }                    else                    {                        break;                    }                }            }        }        ~TcpClient()        {            if(_sock >= 0)                close(_sock);        }    private:        string _serverip;        uint16_t _port;        int _sock;    };} // namespace client

tcpClient.cc:启动客户端

#include"tcpClient.hpp"#includeusing namespace client;static void Usage(string proc){    cout << "\nUsage:\n\t" << proc << " serverip serverport\n\n";}int main(int argc,char* argv[]){    if(argc != 3)    {        Usage(argv[0]);        exit(-1);    }    uint16_t port = atoi(argv[2]);    string ip = argv[1];    unique_ptr tcc(new TcpClient(ip,port));    tcc->InitClient();    tcc->start();    return 0;}

4.编译链接

makefile:

.PHONY:allall:tcpServer tcpClienttcpServer:tcpServer.ccg++ -o $@ $^ -std=c++11tcpClient:tcpClient.ccg++ -o $@ $^ -std=c++11.PHONY:cleanclean:rm tcpServer tcpClient

5.测试

 如图所示,服务端和客户端可以完成正常的数据通信了。

6.总结

        TCP协议和UDP协议在数据通信的实现中,除了一些接口使用的不同之外,其实并没有太大的不同,在之前说的UDP是面向数据报的而TCP是面向字节流的,这些特性又是如何体现的呢?关于这个问题,博主将在后面的文章中会为大家继续进行介绍。不要错过哦!

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

免责声明:

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

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

TCP服务器—实现数据通信

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

下载Word文档

猜你喜欢

Python基于socket实现TCP/IP客户和服务器通信

目录前言简单的搭建服务器与客户端服务器客户端create_connection(更简易的客户端)前言 套接字除了用于分析网络地址等功能之外,还可以配置一个服务器,监听到来的消息。 比如你在网络上跟网络机器人聊天,你发送数据到机器人(服务器)
2022-06-02

Python基于socket如何实现TCP/IP客户和服务器通信

这篇文章主要为大家展示了“Python基于socket如何实现TCP/IP客户和服务器通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python基于socket如何实现TCP/IP客户和服务
2023-06-15

微信访问阿里云服务器实现实时通信与数据分析

随着互联网技术的不断发展,各种应用和服务已经深入人心,微信作为最流行的社交软件之一,已经成为人们日常生活中不可或缺的一部分。同时,阿里云服务器作为强大的数据存储和计算平台,也成为了企业和个人的重要工具。那么,如何将微信和阿里云服务器进行无缝连接,实现即时通信和数据分析呢?本篇文章将为您详细解答。正文:微信访问阿里
微信访问阿里云服务器实现实时通信与数据分析
2023-12-09

Golang TCP服务器 - 实现客户端之间的数据交流

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Golang TCP服务器 - 实现客户端之间的数据交流》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎
Golang TCP服务器 - 实现客户端之间的数据交流
2024-04-04

python中如何搭建单向通信TCP服务器

这篇文章主要为大家展示了“python中如何搭建单向通信TCP服务器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中如何搭建单向通信TCP服务器”这篇文章吧。1、搭建流程(1)首先创
2023-06-15

Docker跨服务器通信Overlay怎么实现

本篇内容主要讲解“Docker跨服务器通信Overlay怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker跨服务器通信Overlay怎么实现”吧!场景公司微服务快上线了,微服务都
2023-06-21

实现与阿里云服务器的通信

本文将详细介绍如何实现与阿里云服务器的通信。首先,我们将介绍阿里云服务器的基本信息和其通信协议。然后,我们将介绍如何使用阿里云的SDK进行服务器通信。最后,我们将介绍一些常见的问题及其解决方案。一、阿里云服务器的基本信息阿里云服务器是阿里云提供的云计算服务,具有高可用性、高性能、低成本、易于管理等特点。阿里云服务
实现与阿里云服务器的通信
2023-11-11

Python socket网络编程TCP/IP服务器与客户端通信

Python socket网络编程 初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好
2022-06-04

编程热搜

目录