【socket通信】python实现简单socket通信| server和client

news2024/11/14 21:40:35

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、socket通信基础知识
    • 1.1基础知识
    • 1.2socket类型
  • 二、socket python实现
    • 2.1.服务器代码 server.py
    • 2.2.客户端代码 client.py
    • 2.3.如何运行
  • 补充的计网知识


前言

参考内容:
1)TCP/IP网络通信之Socket编程入门

一、socket通信基础知识

1.1基础知识

socket又名套接字。
socket启动需要的基础信息:进行通信的主机号端口号。(端口号其实代表了进程,也就是主机上的哪一个应用程序会进行通信)
socket就像数据线一样连接于两个电脑之间,作为通信的桥梁。

1.2socket类型

socket一般有两种类型:TCP和UDP
TCP:Transmission Control Protocol 传输控制协议
TCP协议是可靠的,发送的数据对方一定会收到。TCP是基于数据流的协议(data stream).
UDP:User Datagram Protocol 用户报文协议
UDP是不可靠的,不一定保证数据一定能被对方接收到。UDP一般具有更低的延迟并且会占用更少的资源(适合语音通话)

以下内容是根据chatGPT所捕获的TCP和UDP的知识点:

TCP和UDP是两种不同的网络传输协议。TCP (Transmission Control Protocol) 是一种面向连接的协议,它建立一个可靠的连接,然后在连接上发送数据。UDP (User Datagram Protocol) 是一种无连接的协议,它不保证数据的可靠传输。TCP协议在传输数据之前需要进行三次握手,建立连接后,数据传输的可靠性较高,但是传输效率较低。UDP协议不需要建立连接,传输效率较高,但是无法保证数据的可靠性。
TCP协议适用于需要可靠数据传输的场景,例如电子邮件、文件传输、网页浏览等。UDP协议适用于需要快速传输的场景,例如音频、视频流等。

二、socket python实现

2.1.服务器代码 server.py

import socket

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

# 获取本地主机名和端口号
host = socket.gethostname()
port = 8888

# 将socket对象绑定到指定的主机和端口上
server_socket.bind((host, port))

# 开始监听连接
server_socket.listen(1)

# 等待客户端连接
print("等待客户端连接...")
client_socket, client_address = server_socket.accept()

print("连接来自: ", client_address)

# 接收客户端发送的数据
data = client_socket.recv(1024)

# 处理接收到的数据
print("接收到的数据为: ", data.decode())

# 发送响应数据给客户端
message = "欢迎连接到服务器!"
client_socket.send(message.encode())

# 关闭客户端连接
client_socket.close()

1)socket.gethostname()和socket.gethostbyname()是不一样的:
socket.gethostname()获取当前主机的主机名,以便在Socket连接中进行使用。如果你想要使用IP地址而不是主机名来进行Socket连接,可以使用socket.gethostbyname()函数来获取主机的IP地址。
2)关于端口号
一旦通过socket.bind()方法将一个socket对象绑定到一个IP地址和端口号上,这个socket对象就会被分配一个唯一的端口号。这个端口号可以用来发送和接收数据,从而实现Socket通信。
当客户端想要连接到这个服务器时,客户端需要知道服务器的IP地址和端口号。客户端通过这个端口号来建立Socket连接,并与服务器进行通信,从而实现数据的传输和交换。因此,端口号是Socket通信中非常重要的一个概念。
这个端口号是为这个socket对象而生的。
3)server_socket.accept()
server_socket.accept()会阻塞程序运行,直到有客户端连接进来。一旦有客户端连接进来,accept()方法就会返回一个新的socket对象client_socket和该客户端的地址信息client_address。
通过client_socket可以和该客户端进行通信,而client_address包含了该客户端的IP地址和端口号,可以用于标识该客户端的身份。

2.2.客户端代码 client.py

import socket

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

# 获取服务器的主机名和端口号
host = socket.gethostname()
port = 8888

# 连接到服务器
client_socket.connect((host, port))

# 发送消息给服务器
message = "Hello, 服务器!"
client_socket.send(message.encode())

# 接收服务器发送的响应数据
data = client_socket.recv(1024)

# 处理接收到的响应数据
print("接收到的数据为: ", data.decode())

# 关闭客户端连接
client_socket.close()

1)与服务器代码的不同之处:
与服务器代码相比,客户端代码的主要区别在于它使用了socket.connect()方法连接到服务器,并使用socket.send()方法发送消息给服务器,而服务器代码则使用socket.bind()方法绑定一个IP地址和端口号,并使用socket.listen()方法监听客户端连接请求,然后使用socket.accept()方法接受客户端连接,并使用socket.recv()方法接收客户端发送的消息。
2)message.encode()
message.encode()是Python中字符串的一个方法,用于将字符串编码为字节序列。在Python中,字符串是以Unicode编码存储的,而网络传输中常使用字节序列来传输数据,因此需要将字符串编码为字节序列才能在网络上传输。
message.encode()方法将字符串message按照默认的编码方式(通常是UTF-8编码)编码为字节序列,并返回一个bytes类型的对象。这个bytes对象可以直接传输给socket的send()方法发送到网络中。在接收端,需要将接收到的字节序列使用相应的解码方法(如bytes.decode()方法,这个在服务器程序中出现过)解码为字符串。

2.3.如何运行

使用方法:分别用两个终端cmd运行两个py文件(先服务器后客户端),最后得到的结果如下:
服务器:
在这里插入图片描述

客户端:
在这里插入图片描述

以上代码肯定对于初学者会衍生出来不少问题
1)客户端的端口号应该设置成什么样子?
在Socket通信中,端口号是用来标识服务器程序或客户端程序的。在服务器程序中,我们需要指定一个端口号,以便客户端程序可以连接到该端口上进行通信。通常情况下,我们可以选择一些预定义的端口号,例如HTTP协议的端口号是80,SMTP协议的端口号是25等。但是,如果预定义的端口号已经被占用或者不适合我们的应用程序,我们也可以选择自定义端口号。
在你提供的代码中,端口号是自定义的,可以根据需要进行设置。一般情况下,我们可以选择一些未被占用的端口号,例如8888。
2)相应之下,是不是客户端的端口号也需要设置为相同的值?

如果服务器的端口号设置为8888,那么客户端在连接服务器时也需要指定端口号为8888。这样客户端才能够连接到正确的端口上,与服务器进行通信。在Socket通信中,端口号是用来标识服务器程序或客户端程序的,因此在客户端和服务器之间进行通信时,端口号必须保持一致才能够成功建立连接。

补充的计网知识

部分答案来自chatgpt
1)特殊地址:127.0.0.1

127.0.0.1是一个特殊的IP地址,也称为本地回环地址。它指向本机的网络接口,也就是说,当你访问这个地址时,实际上是在访问本机自己。这个地址通常用于测试网络应用程序,以及在本机上安装一些服务器软件时,可以使用这个地址进行测试。例如,当你在本机上安装了一个Web服务器,可以使用浏览器访问127.0.0.1来测试Web服务器是否正常工作。
2)
host = socket.gethostbyname(socket.gethostname()) 和host="127.0.0.1"是不是一个意思?
host = socket.gethostbyname(socket.gethostname()) 和 host=“127.0.0.1” 不完全相同,虽然它们都可以用于指定本机的IP地址。
socket.gethostbyname(socket.gethostname()) 会返回当前主机的IP地址,这个地址可以是一个局域网IP地址,也可以是一个公网IP地址。如果你的电脑连接了一个局域网,那么这个IP地址就可以用于在局域网内进行通信。
host=“127.0.0.1” 则表示使用本机的回环地址(loopback address),也就是127.0.0.1。这个地址是一个特殊的IP地址,它只能在本机内部使用,不能用于在局域网或公网进行通信。
在上述代码中,使用 socket.gethostbyname(socket.gethostname()) 可以获取本机的IP地址,这样就可以在局域网内进行通信。如果你只是在本机内部进行通信,也可以使用 host=“127.0.0.1”。

3)进程间通信和socket通信的区别
进程间通信和Socket通信是两种不同的通信方式,它们的实现机制和应用场景都有所不同。
进程间通信(IPC,Inter-Process Communication)是指在同一台计算机上运行的不同进程之间进行通信的机制,主要用于实现同一计算机上不同应用程序之间的数据传输。IPC机制可以通过命名管道(named pipe)、共享内存、消息队列、信号量等方式来实现,它们的实现都是通过操作系统提供的API来实现的。IPC通信的优点是速度快、可靠性高,但是只能在同一台计算机上进行通信。
Socket通信是一种基于网络的通信方式,它是通过一组标准的TCP/IP协议来实现的,可以在不同计算机之间实现数据传输。Socket通信是一种面向连接的通信方式,通信的过程中需要建立连接、传输数据、断开连接等步骤,因此它的实现比IPC要复杂一些。Socket通信的优点是可以在不同的计算机之间进行通信,可以实现跨网络的数据传输,但是相对于IPC,Socket通信的速度会稍微慢一些。
总之,进程间通信和Socket通信都有各自的优缺点,需要根据具体的应用场景来选择合适的通信方式。如果只需要在同一台计算机上进行通信,可以选择IPC机制;如果需要在不同的计算机之间进行通信,可以选择Socket通信。

4)socket通信和网络通信是一个概念吗

Socket通信和网络通信是相关的概念,但并不完全等同。
网络通信是指通过计算机网络进行数据传输的过程,包括了多种不同的通信方式和协议,例如TCP/IP、HTTP、FTP等。网络通信的目的是将数据从一个计算机传输到另一个计算机,使得不同计算机之间可以互相传递信息。
Socket通信是一种基于网络的通信方式,它是通过一组标准的TCP/IP协议来实现的。在Socket通信中,数据传输需要经过网络协议栈的处理,其中TCP/IP协议是最常用的网络协议之一。Socket通信是一种面向连接的通信方式,通信的过程中需要建立连接、传输数据、断开连接等步骤,因此它的实现比其他网络通信方式要复杂一些。
因此,可以说Socket通信是网络通信的一种具体实现方式,它是通过TCP/IP协议来实现的。网络通信涵盖了多种不同的通信方式和协议,而Socket通信是其中一种实现方式。

5)字符串编码和字节序列是?
当我们需要在网络上传输数据时,需要将数据编码为字节序列,才能通过网络进行传输。而在Python中,字符串是以Unicode编码存储的,因此需要将字符串编码为字节序列才能在网络上传输。
下面是一个例子,将字符串编码为字节序列:

s = “hello world”
b = s.encode()

print(b) # b’hello world’

在这个例子中,我们先定义了一个字符串s,然后使用s.encode()方法将其编码为字节序列b,并将其打印出来。输出结果是b’hello world’,表示字符串"hello world"已经被编码为一个bytes类型的对象。
当接收方接收到字节序列后,需要将其解码为字符串才能进行处理。下面是一个将字节序列解码为字符串的例子:

b = b’hello world’
s = b.decode()

print(s) # hello world

在这个例子中,我们先定义了一个字节序列b,然后使用b.decode()方法将其解码为字符串s,并将其打印出来。输出结果是hello world,表示字节序列b’hello world’已经被解码为字符串"hello world"。

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

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

相关文章

2023年TikTok网红营销:从短视频到直播,多维度提升品牌价值

随着TikTok的持续热度,TikTok网红营销已经成为了品牌推广中不可忽视的一部分。在2023年,TikTok网红营销将会继续保持强劲的发展势头。本文Nox聚星将会详细介绍2023年TikTok网红营销的发展趋势,并探讨品牌应该如何抓住这些趋势来提高自己的推广…

「 JavaSE 」说说什么是泛型的类型擦除?

「 JavaSE 」说说什么是泛型的类型擦除? 参考&鸣谢 面试官:说说什么是泛型的类型擦除? Dr Hydra Java泛型类型擦除以及类型擦除带来的问题 蜗牛大师 文章目录 「 JavaSE 」说说什么是泛型的类型擦除?一、前言二、类型擦除做了…

Windows应急响应排查思路

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Windows应急响应 一、用户分析1、普通用户2、隐藏用户3、克隆账户 二、日志分析1、Window…

基于互相关性的信号同步

许多测量涉及多个传感器异步采集的数据。如果您要集成信号并以关联式研究它们,您必须同步它们。为此,请使用 xcorr。 例如,假设有一辆汽车经过一座桥。它产生的振动由位于不同位置的三个相同传感器进行测量。信号有不同到达时间。 将三个时…

【技术分享】Livedata粘性事件实现源码解析,让你彻底掌握数据更新机制

概述 Livedata粘性事件是Android中常用的一种观察者模式,它可以让数据在发生改变时通知观察者并更新UI。在实际开发中,我们可能会遇到粘性事件的情况,即先发送了一个数据,后来才有观察者来监听,这时候我们需要保证观察…

集合Map高频面试题

1、介绍下 HashMap 的底层数据结构吧。 在 JDK 1.8,HashMap 底层是由 “数组链表红黑树” 组成,如下图所示,而在 JDK 1.8 之前是由 “数组链表” 组成,就是下图去掉红黑树。 2、为什么使用“数组链表”? 使用 “数组…

如何用 ModelScope 实现 “AI 换脸” 视频

前言 当下,视频内容火爆,带有争议性或反差大的换脸视频总能吸引人视线。虽然 AI 换脸在市面上已经流行了许久,相关制作工具或移动应用也是数不胜数。但是多数制作工具多数情况下不是会员就是收费,而且替换模板有限。以下在实战的角…

三电技术之电机电驱技术

三电技术之电机电驱技术 1 基本功能 电动汽车驱动电机及其控制系统是电动汽车的心脏,是把电能转化为机械能来驱动车辆的部件。它的任务是在驾驶人的控制下,高效率地将动力电池的能量转化为车轮的动能,或者将车轮上的动能反馈到动力电池中。 …

16 个优秀的 Vue 开源项目

为什么我们要关注Vue Vue是一个用于构建用户界面的JavaScript框架。值得关注的是,它在没有谷歌和Facebook的支持下获得了大量的人气。 Vue是结合react和angular的最好的方法,并且拥有一个有凝聚力的,活跃的,能够应对开发问题的大型…

消息队列如何保证消息的幂等性

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 文章目录 什么是幂等性什么是消息的幂等性为什么会出现消息幂等性问题该如何解决消息幂等性问题总结 在分布式系统中,消息队列…

【C++入门必备知识:命名空间与关键字】

【C入门必备知识:命名空间与关键字】 【命名空间】①.命名空间定义Ⅰ.正常定义命名空间Ⅱ.嵌套定义命名空间Ⅲ.合并命名空间 ②.命名空间的使用Ⅰ.命名空间名称及域作用限定符Ⅱ.using成员引入Ⅲ.using namespace名称全部引入 ③.注意事项 【C关键字(C98)】 【命名空…

Ubuntu系统安装docker、docker-compse

环境:Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic x86_64) 一、安装docker 1.卸载旧版本 ubuntu下自带了docker的库,不需要添加新的源。 但是ubuntu自带的docker版本太低,需要先卸载旧的再安装新的 sudo apt-get remove docker docke…

免费的语音转文字软件有哪些?推荐一款好用的

随着人工智能技术的不断发展,语音识别技术已经得到了广泛的应用。语音转文字软件是其中的一种应用,它能够将人们说出的话语自动转化为文字,从而方便人们进行文本处理、记录、存档等操作。在现实生活中,有很多人需要使用语音转文字…

Redis的哈希表是如何扩容的?

文章目录 一般面试回答哈希表结构字典数据结构解决哈希冲突扩容/缩容对字典的哈希表rehash步骤 渐进式rehash渐进式rehash步骤 相关问题 一般面试回答 redis 解决冲突的方法是使用链地址法,另外当容量不足的时候,则使用Rehash 进行扩容。 Rehash&#x…

96-Linux_UDP实现客户端和服务器端

UDP实现客户端和服务器端 一.udp实现客户端和服务器端的编程流程二.udp实现实现客户端和服务器端所用的接口1.socket2.sendto3.recvfrom 三.udp服务器端代码和客户端的代码1.服务器端2.客户端 一.udp实现客户端和服务器端的编程流程 udp提供无链接的,不可靠的,数据报服务; 二…

burp suite 插件编写-基础

文章目录 前言一、插件的官方文档二、Montoya API jar包结构三、HTTP 处理程序小结 四、代码示例 前言 burp插件入门。入门,我们大概有一个框架,心里不再有怎么做,为什么可以这么做的疑问。现在就要更具体的来回答“怎么做”这个问题。我们通…

基于C#编程建立泛型Vector数据类型及对应处理方法

目录 一、简介 二、方法 2.1 建立Vector类 2.2 Vector成员 2.3 Vector属性 2.4 Vector方法 2.4.1 构造函数 2.4.2 Vector元素操作方法 2.4.3 Vector 运算 三、调用方法 3.1 方法 3.1.1 Append 3.1.2 this[] 3.1.3 Insert 3.1.4 DelLen 3.1.5 FindNumber 3.1.6 …

PHP快速入门04-前后端数据交互与文件上传

文章目录 前言前后端数据交互与文件上传前后端数据交互 $_GET $_POST文件上传 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 前后端数据交互与文件上传 前后端数据交互 $_GET $_POST 他们都是超全局变量。它们用于从HTTP请求中获取数据&#xff0…

除了学历,你更需要有能力

遥想当年,家里培养出一个大学生,是多荣耀的事!可现今却处于一个比较尴尬的状态。 为什么大学生贬值得这么厉害?其实大学生之所以会不值钱不外乎三大原因:量大、与企业需求不匹配、质量差。 高校扩招下,大…

OpenAI最新官方ChatGPT聊天插件接口《接入插件快速开始》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(二)(附源码)

Getting started 快速开始 前言Introduction 导言Plugin manifest 插件清单OpenAPI definition OpenAPI定义Running a plugin 运行插件Setup a local proxy of your public API 设置公共API的本地代理 Writing descriptions 书写描述Best practices Debugging 排除故障其它资料…