iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >TCP服务器—实现数据通信
  • 526
分享到

TCP服务器—实现数据通信

tcp/ip服务器网络 2023-08-31 05:08:11 526人浏览 薄情痞子
摘要

目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.编译链接 5.测试 6.总结 前言         今天我们要介绍的是使用tcp协议实现数据通信,相比于之前写的UDP服务器实现数据信,在主体逻辑上并没有差别。客户端向服务

目录

前言

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

--结束END--

本文标题: TCP服务器—实现数据通信

本文链接: https://www.lsjlt.com/news/384242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • TCP服务器—实现数据通信
    目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.编译链接 5.测试 6.总结 前言         今天我们要介绍的是使用TCP协议实现数据通信,相比于之前写的UDP服务器实现数据信,在主体逻辑上并没有差别。客户端向服务...
    99+
    2023-08-31
    tcp/ip 服务器 网络
  • TCP实现服务器和客户端通信
    目录 TCP介绍 代码实现 server(服务器端) 代码分析 client(客户端) 代码分析 结果展示 TCP介绍 TCP (Transmission Control Protocol) 是一种面向连接的协议,用于在计算机网络中传...
    99+
    2023-09-06
    tcp/ip 服务器 网络
  • UDP服务器—实现数据通信
    目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.测试 总结 前言         在这篇文章中为大家介绍如何通过编码实现数据通信,实现思路是根据前面介绍的网络编程函数编写一个服务端和客户端,实现客户端和服务端双方通信 1...
    99+
    2023-08-30
    udp 服务器 网络协议
  • 基于QT的TCP通信服务的实现
    目录一、结构1.1 套接字1.2 socket通信流程1.3 QTcpsocket1.4 QTcpServer二、设计UI2.1 客户端UI2.2 服务器端UI三、核心代码四、效果图...
    99+
    2022-11-13
  • QT实现TCP通信(服务器与客户端搭建)
    一、TCP通信框架 二、QT中的服务器操作 创建一个QTcpServer类对象,该类对象就是一个服务器调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服...
    99+
    2023-10-21
    服务器 tcp/ip 网络
  • Python基于socket实现TCP/IP客户和服务器通信
    目录前言简单的搭建服务器与客户端服务器客户端create_connection(更简易的客户端)前言 套接字除了用于分析网络地址等功能之外,还可以配置一个服务器,监听到来的消息。 比如你在网络上跟网络机器人聊天,你发...
    99+
    2022-06-02
    Python 客户和服务器通信 Python TCP/IP 通信
  • Python基于socket如何实现TCP/IP客户和服务器通信
    这篇文章主要为大家展示了“Python基于socket如何实现TCP/IP客户和服务器通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python基于socket如何实现TCP/IP客户和服务...
    99+
    2023-06-15
  • python中如何搭建单向通信TCP服务器
    这篇文章主要为大家展示了“python中如何搭建单向通信TCP服务器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中如何搭建单向通信TCP服务器”这篇文章吧。1、搭建流程(1)首先创...
    99+
    2023-06-15
  • C++多线程实现TCP服务器端同时和多个客户端通信
    通讯建立后首先由服务器端发送消息,客户端接收消息;接着客户端发送消息,服务器端接收消息,实现交互发送消息。 服务器同时可以和多个客户端建立连接,进行交互; 在某次交互中,服务器端...
    99+
    2022-11-12
  • 微信访问阿里云服务器实现实时通信与数据分析
    随着互联网技术的不断发展,各种应用和服务已经深入人心,微信作为最流行的社交软件之一,已经成为人们日常生活中不可或缺的一部分。同时,阿里云服务器作为强大的数据存储和计算平台,也成为了企业和个人的重要工具。那么,如何将微信和阿里云服务器进行无缝...
    99+
    2023-12-09
    阿里 实时 通信
  • TCP服务器的C#实现
    TCP实现类 internal class TcpServer { public Socket ServerSocket { get; set; } public D...
    99+
    2023-09-04
    tcp/ip 服务器 c#
  • Qt实现简单TCP服务器
    本文实例为大家分享了Qt学习记录之简单的TCP服务器,供大家参考,具体内容如下 简单的多连接TCP服务器​ 本节我们使用Qt来编写一个简单的多连接TCP服务器程序,涉及到的功能有监听...
    99+
    2022-11-13
  • JAVA Socket实现实时接收TCP消息,让你的服务端通信更高效!
    本文主要介绍如何利用socket实现实时接收服务端发送的TCP消息。 目录 一、需要掌握 二、程序源码 三、运行演示 一、需要掌握 网络调试助手下载:https://www.aliyundrive.com/s/6Y8L7Wv5s...
    99+
    2023-09-07
    tcp/ip java 网络协议
  • Python socket网络编程TCP/IP服务器与客户端通信
    Python socket网络编程 初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深...
    99+
    2022-06-04
    客户端 网络编程 通信
  • 实现一款高可用的 TCP 数据传输服务器(Java版)
    1.netty能做什么 首先netty是一款高性能、封装性良好且灵活、基于NIO(真·非阻塞IO)的开源框架。可以用来手写web服务器、TCP服务器等,支持的协议丰富,如:常用的HTTP/HTTPS/WEBSOCKET,并且提供的大量的方法...
    99+
    2023-09-15
    java tcp/ip 服务器
  • S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)
    S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应) 前面和大家介绍了MODBUS TCP的基本使用方法,具体可参考以下链接中的内容: S7-200SMART...
    99+
    2023-09-11
    S7-200SMART MODBUS TCP通信 具体方法 客户端读写 服务器响应
  • Docker跨服务器通信Overlay怎么实现
    本篇内容主要讲解“Docker跨服务器通信Overlay怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker跨服务器通信Overlay怎么实现”吧!场景公司微服务快上线了,微服务都...
    99+
    2023-06-21
  • 实现与阿里云服务器的通信
    本文将详细介绍如何实现与阿里云服务器的通信。首先,我们将介绍阿里云服务器的基本信息和其通信协议。然后,我们将介绍如何使用阿里云的SDK进行服务器通信。最后,我们将介绍一些常见的问题及其解决方案。 一、阿里云服务器的基本信息阿里云服务器是阿里...
    99+
    2023-11-11
    阿里 通信 服务器
  • 如何通过WebSocket实现浏览器与服务器的通信
    这篇文章给大家分享的是有关如何通过WebSocket实现浏览器与服务器的通信的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。现如今有个需求,基于websocket实现浏览器与服务器的通信。由于之前没有使用过webs...
    99+
    2023-06-04
  • GO语言如何实现TCP服务器
    今天小编给大家分享一下GO语言如何实现TCP服务器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。interface/tcp/...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作