Socket实现服务器和客户端(手把手教会)

简介: Socket实现服务器和客户端(手把手教会)

Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。

Socket 编程中服务器端和客户端的基本步骤:

服务器端步骤:

1.创建 Socket:

int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  • 使用 socket 函数创建一个套接字。
  • AF_INET 表示使用 IPv4 地址族。
  • SOCK_STREAM 表示使用 TCP 协议,如果使用 UDP,则为 SOCK_DGRAM。

2.绑定地址和端口:

   struct sockaddr_in serverAddress;
   serverAddress.sin_family = AF_INET;
   serverAddress.sin_addr.s_addr = INADDR_ANY;
   serverAddress.sin_port = htons(PORT);
 
   bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
  • 初始化服务器地址结构体 sockaddr_in,设置 IP 地址和端口。
  • 使用 bind 函数将套接字绑定到指定的地址和端口。

3.监听连接请求:

listen(serverSocket, BACKLOG);
  • 使用 listen 函数开始监听连接请求。
  • BACKLOG 参数指定连接请求队列的最大长度。

4.接受客户端连接:

int clientSocket = accept(serverSocket, NULL, NULL);

使用 accept 函数接受客户端的连接请求。

返回一个新的套接字 clientSocket,用于与客户端通信。


5.接收和发送数据:

       使用 recv 函数从客户端接收数据,使用 send 函数向客户端发送数据。

关闭连接:

   close(clientSocket);
   close(serverSocket);

使用 close 函数关闭连接的套接字。

客户端步骤:

1. 创建 Socket:

int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
  • 使用 socket 函数创建一个套接字。
  • 设置服务器地址和端口:
   struct sockaddr_in serverAddress;
   serverAddress.sin_family = AF_INET;
   serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);
   serverAddress.sin_port = htons(PORT);
  • 初始化服务器地址结构体 sockaddr_in,设置服务器的 IP 地址和端口。
  • 连接到服务器:
connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
  • 使用 connect 函数连接到服务器。
  • 发送和接收数据:
  • 使用 send 函数向服务器发送数据,使用 recv 函数从服务器接收数据。
  • 关闭连接:
close(clientSocket);

使用 close 函数关闭连接的套接字。

解决分包、粘包问题

Socket实现模拟TCP通信粘包问题-CSDN博客

Client:

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main(){
 
    //1.创建socket
    int client_sock=socket(AF_INET,SOCK_STREAM,0);
    if (client_sock==-1)
    {
        std::cerr<<"Faild to create socket"<<std::endl;
        return -1;
    }
 
    //2.连接服务器
 
    struct sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;
    //server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
    server_addr.sin_port=htons(9999);
 
    if(connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){
        std::cerr<<"Faild to connect socket"<<std::endl;
        return -1;
    }
 
    std::cout<<"Connected to server"<<std::endl;
 
    //3.数据交互
 
    //发送消息
    
    std::string msg="Hello server!\n";
 
    if(write(client_sock,msg.c_str(),msg.length())==-1){
        std::cerr<<"Faild to write "<<std::endl;
        return -1;
    }
 
    //接受消息
 
    char buffer[1024];
    if(read(client_sock,buffer,sizeof(buffer))==-1){
        std::cerr<<"Faild to read"<<std::endl;
        return -1;
    }
 
    printf("Receive to server :%s",buffer);
 
    close(client_sock);
    
 
}

Server:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
 
int main(int, char**){
    //1.创建套接字
    int listen_sock=socket(AF_INET,SOCK_STREAM,0);
 
    if (listen_sock==-1)
    {
        std::cerr<<"Fiald to create socket"<<std::endl;
        return 1;
    }
    
 
    //2.绑定IP地址
    struct sockaddr_in server_addr;
    memset(&server_addr,0,sizeof(server_addr));
 
    server_addr.sin_addr.s_addr=INADDR_ANY;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(9999);
 
    if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1)
    {
        std::cerr<<"Fiald to bind socket"<<std::endl;
        return 1;
    }
    //3.监听套接字
 
    if (listen(listen_sock,5)==-1)
    {
        std::cerr<<"Fiald to listen socket"<<std::endl;
        return 1;
    }
    
    std::cout<<"server is listening"<<std::endl;
 
    //4.接受客户端的连接
 
    struct sockaddr_in client_addr;
    socklen_t client_addr_len=sizeof(client_addr);
 
    int client_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&client_addr_len);
 
    if (client_sock==-1)
    {
        std::cerr<<"Fiald to accept socket"<<std::endl;
        return 1;
    }
    std::cout<<"a client connected"<<std::endl;
 
    //5.数据交互
    
    //接受消息
 
    char buffer[1024];
    int read_size=read(client_sock,buffer,sizeof(buffer));
    
    if (read_size==-1) 
    {
        std::cerr<<"Fiald to read"<<std::endl;
        return 1;
    }
    
 
    std::cout<<"Received to client :"<<buffer<<std::endl;
    std::string res_msg="Hello Client!";
    int wr=write(client_sock,res_msg.c_str(),res_msg.length());
 
    if (wr==-1)
    {
        std::cerr<<"Fiald to write"<<std::endl;
        return 1;
    }
    
 
    close(client_sock);
    close(listen_sock);
 
    
 
 
 
}
相关文章
|
27天前
|
Java
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
57 1
|
1月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
35 6
|
30天前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
20 2
|
1月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
1月前
|
JSON 前端开发 JavaScript
Web中的客户端和服务器端
Web中的客户端和服务器端
|
17天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
38 0
|
17天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
53 0
|
24天前
|
存储 网络协议 物联网
网络中的“客户端”和“服务器
【8月更文挑战第24天】
33 0
|
2月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
27 4
|
2月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
50 2