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 8000int 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;
}

客户端代码示例:

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash命令: logrotate的使用

1. 概述 Linux服务器上运行的程序都会通过日志来告知外部自己的运行过程、结果以及遇到的问题&#xff0c;随着日志的不断累计&#xff0c;它会变的越来越大&#xff0c;所以常见的方案是根据时间或者日志文件的大小&#xff0c;对日志文件进行轮转&#xff0c;比如Java程序里…

简单使用selenium抓取微博热搜话题存储进Excel表格中

#test.pyimport requests from selenium import webdriver import time from write import write#首先打开浏览器 drive webdriver.Chrome()#设置隐式等待&#xff1a;等待元素找到&#xff0c;如果找到元素则马上继续执行语句&#xff0c;如果找不到元素&#xff0c;会在设定…

【PWN】学习笔记(三)【返回导向编程】(下)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

动物疾控中心污水处理设备工艺特点

诸城市鑫淼环保小编带大家了解一下动物疾控中心污水处理设备工艺特点 1、采用中和沉淀、复合式消毒、UV紫外线光波灭菌、臭氧氧化、多介质过滤等技术处理废水中的各类污染物; 2、利用pH计和进口计量泵控制投药量,并设有液位控制、水位报警等装置; 3、操作方便,运行稳定,使用寿命…

Jira 中如何修改时间为绝对时间

问题描述 在使用Jira的时候&#xff0c;有一些时间显示的是相对时间&#xff0c;如&#xff1a;2天前&#xff0c;3个小时前等&#xff0c;有些用户不习惯这样的显示方式&#xff0c;希望使用绝对的时间格式&#xff0c;如&#xff1a;2022年2月22日 22:22 应该怎样修改 解…

用python打印出菱形图案

你可以使用Python编写一个简单的函数来打印菱形图案。下面是一个例子&#xff0c;这个函数接受一个参数n&#xff0c;表示菱形的高度&#xff0c;然后打印出一个菱形图案&#xff1a; def print_diamond(n): # 上半部分 for i in range(n): print(" " …

python 多进程

python 多进程 多进程和多线程什么是进程什么是线程多进程和多线程的区别与联系优缺点多线程的优点多线程的缺点多进程的优点多进程的缺点 选择多线程还是多进程&#xff1f; 多进程使用multiprocessing.Process创建多进程通过multiprocessing.Process模块创建继承Process类来创…

springboot098基于web的网上摄影工作室的开发与实现

springboot098基于web的网上摄影工作室的开发与实现 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

Java Applet 基础

标题&#xff1a;Java Applet 基础 介绍&#xff1a; Java Applet是Java语言提供的一种用于在网页中嵌入小型程序的技术。通过使用Java Applet&#xff0c;开发者可以在网页中添加交互性和动态性。本文将介绍Java Applet的基本概念和使用方法&#xff0c;并提供相应的示例代码…

微搭低代码实现登录注册功能

目录 1 创建用户数据源2 实现登录逻辑3 搭建登录页面4 设置登录框5 实现登录的逻辑6 用户注册总结 原来产品在创建应用的时候可以创建模型应用&#xff0c;模型应用对应我们小程序的后端。最新的更新已经将模型应用的能力下线&#xff0c;那我们不得不自己实现一下后端的逻辑。…

Day49| Leetcode 121. 买卖股票的最佳时机 Leetcode 122. 买卖股票的最佳时机 II

Leetcode 121. 买卖股票的最佳时机 题目链接 121 买卖股票的最佳时机 本题目之前是用贪心算法做的&#xff0c;今天用一下dp&#xff0c;思路还行&#xff0c;但是对于dp的定义还是比较难抓取的: dp[i][0] 表示第i天持有股票所得最多现金 &#xff0c;这里可能有同学疑惑&am…

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本&#xff08;Version&#xff09;首部长度&#xff08;Header Length&#xff09;区分服务&#xff08;Differentiated Services Field&#xff09;可选字段填充总长度&#xff08;Total Length&#xff09;标识、标…

记录 | vscode无法在这个大型工作区中监视文件更改,请按照说明链接解决问题

在 VSCode 上打开一个项目时&#xff0c;突然弹出以下错误&#xff1a; 无法在这个大型工作区中监视文件更改。请按照说明链接解决问题。 原因&#xff1a; 由于工作区太大包含太多文件导致vs code监视文件达到上限而因此这个错误。在 Linux 上执行以下命令&#xff1a; cat …

spingboot项目实战之若依框架创建新模块

前言 目前的脚手架系统很多&#xff0c;比较早接触诺依框架&#xff0c;以若依框架为参考如何创建新模块 步骤 1. 下载诺依框架&#xff0c;依照参考说明一步步&#xff0c;能做到系统运行起来。 2. 准备好mysql文件&#xff0c;创建新数据库表 3. 数据库管理工具navicat…

操作系统原理-作业三-存储器

某页式虚拟存储管理系统中&#xff0c;页面大小为 2KB &#xff0c;某一进程分配到的内存块数为 3 &#xff0c;并按下列地址顺序引用内存单元&#xff1a; 2531 、 6632 、 4140 、 3584 、 2892 、 5743 、 1700 、 2148 、 6940、 4345 、 3209 、 0732 、 6202 、 4541 。…

Python高效并发请求库

Eventlet 是一个基于协程的并发网络库&#xff0c;用于实现Python中的并发编程。下面是一个使用 Eventlet 创建简单的 TCP 服务器和客户端通信的例子。 安装 Eventlet&#xff1a; pip install eventlet 简单的 Eventlet 服务器示例&#xff1a; import eventletfrom eventle…

[MySQL] MySQL中的索引

文章目录 一、初识索引 1、1 索引的概念 1、2 索引案例 二、认识磁盘 2、1 磁盘结构 2、2 操作系统与磁盘的数据交互 2、3 磁盘随机访问与连续访问 2、4 MySQL与磁盘的数据交互 三、索引的理解 3、1 建立测试表 3、2 为何MySQL与磁盘IO交互是 Page 3、3 理解Page 3、3、1 页目录…

Python 课堂记录

猜数字 import turtle import random import time #时间模块 #生成随机数 ranrandom.randint(1,100) # int :整数 c0 #无限重复执行 while True: c1 # 自增一 cc1 # 等一秒 time.sleep(1) turtle.clear() turtle.write(“第”str©“次&#xff1a;”,font(“黑体”,16) )…

add_subdirectory

Cmake命令之add_subdirectory_cmakelist add_subdirectory-CSDN博客

在线教育培训系统搭建,打造方便快捷的学习模式

教育在我国是一件重中之重的事业发展&#xff0c;所谓“活到老学到老”&#xff0c;人们都离不开教育。 而在当下互联网的发展下&#xff0c;教育、职业培训的方式也变得越来越多样&#xff0c;在线教育模式成为了不少高校的选择&#xff0c;也成为了不少学生的选择。 在线教…