socket是如何进行通信的

这篇具有很好参考价值的文章主要介绍了socket是如何进行通信的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Socket通信的原理大致分为以下几个步骤:

  1. 服务器端建立Socket,开始侦听整个网络中的连接请求。
  2. 当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
  3. 当完成通信后,服务器关闭与客户端的Socket连接。

客户端的步骤如下:

  1. 建立客户端的Socket,确定要连接的服务器的主机名和端口。
  2. 发送连接请求到服务器,并等待服务器的回馈信息。
  3. 连接成功后,与服务器进行数据的交互。
  4. 数据处理完毕后,关闭自身的Socket连接。
    Socket通信的基本原理是基于TCP/IP协议栈的。简单来说,Socket是网络中的一种端点,客户端通过Socket与服务器进行连接和通信。

下面是一个简单的TCP Socket通信的Python代码示例:

python
# 服务器端代码
import socket

# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_address = ('localhost', 8000)
server_socket.bind(server_address)

# 开始监听连接请求
server_socket.listen(1)
print('服务器已启动,等待客户端连接...')

# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f'客户端{client_address}已连接')

# 接收客户端发送的数据
data = client_socket.recv(1024)
print(f'收到客户端发送的数据:{data}')

# 向客户端发送响应数据
response = '你好,客户端!'
client_socket.send(response.encode())

# 关闭连接
client_socket.close()
server_socket.close()
客户端代码:

python
import socket

# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器,指定IP地址和端口号
server_address = ('localhost', 8000)
client_socket.connect(server_address)

# 向服务器发送数据
message = '你好,服务器!'
client_socket.send(message.encode())

# 接收服务器的响应数据
response = client_socket.recv(1024)
print(f'收到服务器的响应:{response}')

# 关闭连接
client_socket.close()

这个示例中,服务器端首先创建一个Socket对象,并绑定到指定的IP地址和端口号上。然后,它开始监听来自客户端的连接请求。当有客户端请求连接时,服务器接受连接请求,并与客户端进行通信。在通信过程中,客户端向服务器发送数据,服务器接收数据并返回响应。最后,双方都关闭连接。

以下是一个简单的C语言Socket通信代码示例:

服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 8000

int main() {
    int server_socket, client_socket;
    struct sockaddr_in server_addr, client_addr;
    char buffer[1024];
    int bytes_read;

    // 创建socket对象
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("socket error");
        exit(1);
    }

    // 绑定IP地址和端口号
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(PORT);
    if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind error");
        exit(1);
    }

    // 开始监听连接请求
    if (listen(server_socket, 1) == -1) {
        perror("listen error");
        exit(1);
    }

    // 等待客户端连接
    socklen_t client_addr_len = sizeof(client_addr);
    client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);
    if (client_socket == -1) {
        perror("accept error");
        exit(1);
    }

    // 接收客户端发送的数据并输出到控制台
    bytes_read = recv(client_socket, buffer, sizeof(buffer), 0);
    if (bytes_read > 0) {
        buffer[bytes_read] = '\0';
        printf("收到客户端发送的数据:%s\n", buffer);
    } else {
        perror("recv error");
        exit(1);
    }

    // 向客户端发送响应数据并关闭连接
    const char *response = "你好,客户端!";
    send(client_socket, response, strlen(response), 0);
    close(client_socket);
    close(server_socket);
    return 0;
}

客户端代码示例:文章来源地址https://www.toymoban.com/news/detail-759941.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 8000
#define SERVER "localhost"

int main() {
    int client_socket;
    struct sockaddr_in server_addr;
    char buffer[1024];
    int bytes_read;

    // 创建socket对象
    client_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (client_socket == -1) {
        perror("socket error");
        exit(1);
    }

    // 连接服务器,指定IP地址和端口号
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER); // 将主机名转换为IP地址
    server_addr.sin_port = htons(PORT); // 将端口号转换为网络字节序
    if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect error");
        exit(1);
    }

    // 向服务器发送数据并等待响应
    const char *message = "你好,服务器!";
    send(client_socket, message, strlen(message), 0);
    bytes_read = recv(client_socket, buffer, sizeof(buffer), 0);
    if (bytes_read > 0) {
        buffer[bytes_read] = '\0';
        printf("收到服务器的响应:%s\n", buffer);
    } else {
        perror("recv error");
        exit(1);
    }

    // 关闭连接
    close(client_socket);
    return 0;
}

到了这里,关于socket是如何进行通信的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以ChatGPT为例进行自然语言处理学习——入门自然语言处理

    ⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您, 麻烦点个赞 👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏 定期更新Qt的一些项目Demo

    2023年04月23日
    浏览(79)
  • R语言对医学中的自然语言(NLP)进行机器学习处理(1)

    什么是自然语言(NLP),就是网络中的一些书面文本。对于医疗方面,例如医疗记录、病人反馈、医生业绩评估和社交媒体评论,可以成为帮助临床决策和提高质量的丰富数据来源。如互联网上有基于文本的数据(例如,对医疗保健提供者的社交媒体评论),这些数据我们可以直接下载

    2024年02月04日
    浏览(43)
  • R语言---使用runway进行机器学习模型性能的比较

    R语言—使用runway进行机器学习模型性能的比较

    2024年02月10日
    浏览(46)
  • LLM-Blender:大语言模型也可以进行集成学习

    最近在看arxiv的时候发现了一个有意思的框架:LLM-Blender,它可以使用Ensemble 的方法来对大语言模型进行集成。 官方介绍如下:LLM-Blender是一个集成框架,可以通过利用多个开源大型语言模型(llm)的不同优势来获得始终如一的卓越性能。 我们都知道集成学习是一种机器学习方法

    2024年02月16日
    浏览(39)
  • 微调实操三:人类反馈对语言模型进行强化学习(RLHF)

    1、前言 前面我们在《微调实操一: 增量预训练(Pretraining)》和《微调实操二: 有监督微调(Supervised Finetuning)》实操的两个章节,学习了PT(Continue PreTraining)增量预训练和SFT(Supervised Fine-tuning)有监督微调过程,,今天我们进入第三阶段的微调, 第三阶段微调主流分成2种做法: 1.1 RLHF(

    2024年02月22日
    浏览(52)
  • C语言再学习 -- Linux常用网络调试工具

    参看:Linux常用网络调试工具 linux常用指令,之前我也总结了不少了。 参看:C语言再学习 – Linux 中常用基本命令 参看:Hi3516A开发–环境搭建工具 下面看看网络调试相关的工具: ifconfig 命令用于检查或设置机器上的网卡。 ping 命令是最常用的命令之一,用于检查两个设备之

    2024年01月21日
    浏览(43)
  • 如何初步学习C语言(4)

    进入大学, 如果你好好学习,校招时拿一个好offer,走上人生巅峰。 如果你不学习,毕业等于失业,回家卖土豆。 这就是选择! if语句 C语言中如何实现循环呢? while语句-讲解 for语句(本系列只是初步学习,这个语句下个系列再说) do … while语句(下系列)

    2024年02月13日
    浏览(40)
  • R语言生存分析(机器学习)(2)——Enet(弹性网络)

    弹性网络(Elastic Net):是一种用于回归分析的统计方法,它是岭回归(Ridge Regression)和lasso回归(Lasso Regression)的结合,旨在克服它们各自的一些限制。弹性网络能够同时考虑L1正则化(lasso)和L2正则化(岭回归),从而在特定情况下对于高维数据集具有更好的性能。    

    2024年02月13日
    浏览(49)
  • 如何系统性的学习Python语言

    零基础同学的福音来了,如果你对Python语言的学习感兴趣,接下来可以由浅入深的了解下Python语言,哪怕你是零基础的小白也完全可以学会的,最后也会给大家放出学习和实例相结合的教程及方法,给到各位同学系统性的教学,最重要的是免费,可真谓是学生党们的福音呀。

    2024年02月10日
    浏览(43)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包