python中的socket网络编程

news2024/11/23 15:15:03

目录

一.服务端开发

1.什么是Socket网络编程

2.基于Socket完成服务端程序开发

步骤

演示

 二.客户端开发

步骤

演示


 

一.服务端开发

1.什么是Socket网络编程

socket(简称套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要socket。
Socket负责进程之间的网络数据传输,好比数据的搬运工。

 客户端和服务端

2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息
Socket客户端:主动连接服务端、可以发送消息、可以接收回复

 

2.基于Socket完成服务端程序开发

步骤

1.创建socket对象

import socket
#创建socket对象
socket_server=socket.socket()

2.绑定socket_server到制定IP和地址

#socket_server.bind((host,port))
#绑定IP地址和端口
socket_server.bind(("localhost",8888))

3.服务端开始监听端口

#socket_server.linsen(backlog)
#backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值
#监听端口
socket_server.listen(1)
#listen方法内接受一个整数型参数,表示接受的链接数量

4.接收客户端连接,获得连接对象

#等待客户端连接
# result:tuple=socket_server.accept()
# conn=result[0]      #客户端和服务器的连接对象
# address=result[1]   #客户端的地址信息

conn,address=socket_server.accept()
#accept方法返回的是二元元组(连接对象,客户端地址信息)
#可以通过变量1,变量2=socket_server.accept()的形式直接接收二元元组内的两个元素
#accept方法,是阻塞方法,等待客户端的连接,就卡在这一行不向下执行了

5.客户端连接后,通过recv方法,接收客户端发送的消息

while True:

    #接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
    data=conn.recv(1024).decode("utf-8")
    #recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
    #recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的信息是{data}")

6.通过conn(客户端当次连接对象),调用send方法可以回复信息

while True:

    #接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
    data=conn.recv(1024).decode("utf-8")
    #recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
    #recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的信息是{data}")
    #发送回复信息
    msg=input("请输入你要和客户端回复的信息:")
    if msg=="exit":
        break
    conn.send(msg.encode("utf-8"))

7.conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接

#关闭连接
conn.close()
socket_server.close()

演示

下载网络调试助手作为客户端
https://github.com/nicedayzhu/netAssist/releases

#服务端开发

import socket
#创建socket对象
socket_server=socket.socket()
#绑定IP地址和端口
socket_server.bind(("localhost",8888))
#监听端口
socket_server.listen(1)
#listen方法内接受一个整数型参数,表示接受的链接数量
#等待客户端连接
# result:tuple=socket_server.accept()
# conn=result[0]      #客户端和服务器的连接对象
# address=result[1]   #客户端的地址信息

conn,address=socket_server.accept()
#accept方法返回的是二元元组(连接对象,客户端地址信息)
#可以通过变量1,变量2=socket_server.accept()的形式直接接收二元元组内的两个元素
#accept方法,是阻塞方法,等待客户端的连接,就卡在这一行不向下执行了
print(f"接收到了客户端的连接,客户端的信息是{address}")

while True:

    #接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
    data=conn.recv(1024).decode("utf-8")
    #recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
    #recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的信息是{data}")
    #发送回复信息
    msg=input("请输入你要和客户端回复的信息:")
    if msg=="exit":
        break
    conn.send(msg.encode("utf-8"))
#关闭连接
conn.close()
socket_server.close()

结果是

 二.客户端开发

步骤

1.创建socket对象

#客户端开发
import socket
#创建socket对象
socket_client=socket.socket()

2.连接到服务端

#连接到服务端
socket_client.connect(("localhost",8888))

3.发送信息

while True:
    #发送信息
    msg=input("要给服务端发送的信息是:")
    if msg=="exit":
        break
    socket_client.send(msg.encode("utf-8"))

4.接收返回信息

while True:
    #发送信息
    msg=input("要给服务端发送的信息是:")
    if msg=="exit":
        break
    socket_client.send(msg.encode("utf-8"))
    #接收返回的信息
    recv_data=socket_client.recv(1024)#1024是缓存区大小,一般1024即可,同样recv方法是阻塞的
    print(f"服务端回复的信息是{recv_data.decode('utf-8')}")

5.关闭连接

#关闭连接
socket_client.close()

演示

#客户端开发
import socket
#创建socket对象
socket_client=socket.socket()
#连接到服务端
socket_client.connect(("localhost",8888))
while True:
    #发送信息
    msg=input("要给服务端发送的信息是:")
    if msg=="exit":
        break
    socket_client.send(msg.encode("utf-8"))
    #接收返回的信息
    recv_data=socket_client.recv(1024)#1024是缓存区大小,一般1024即可,同样recv方法是阻塞的
    print(f"服务端回复的信息是{recv_data.decode('utf-8')}")

#关闭连接
socket_client.close()

结果是

 我们先运行服务端的代码,再运行客户端的代码,这样就可以相互构建连接

 

 

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

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

相关文章

Git系列:入门必备指令详解

Git系列:入门必备指令详解总览高频指令参考资料总览 常用指令使用流程如下图: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository:远程仓库 ——引用自&…

线程学习笔记

线程 出现原因 MP3多个模块放在一个进程中,CPU处理能力,播放可能不连续;放在多个进程中,资源传递、进程维护等开销很大 进程相比于进程,地址空间直接共享 定义 线程是进程的执行流程,除了线程&#xf…

WPF之调用Iconfont

一、调用iconfont 1、首先再Iconfont中新建一个项目,注意修改font family 2、将在线的icon添加到项目中 3、下载安装包到本地 4、更改本地的fontfamily格式如下‘./路径文件夹名/#***’ ***是指再iconfont中的fontfamily 注意如果显示为口 可能是路径不对 如果…

数据结构——栈和队列

目录 一、栈(Stack) 1、定义 2、顺序结构模拟实现栈和常用方法 (1).栈的顺序存储 (2).基本方法 3、栈的链式结构与顺序结构对比 (1).对比 4、区分概念 (1&#x…

JavaScript 库之 vanilla-tilt(一个平滑的 3D 倾斜库)

JavaScript 库之 vanilla-tilt(一个平滑的 3D 倾斜库)参考获取vanilla-tilt特点使用示例使用1. data-tilt2. VanillaTilt.init()优先级示例配置选项其他参考 项目描述GitHub前往Vanilla-tilt.js前往 获取 Vanilla-tilt.jsGitHubnpm npm install vanil…

【开发环境】JRE 裁剪 ② ( 裁剪 bin 目录下的 dll 动态库文件 | 压缩 rt.jar 文件 )

文章目录一、裁剪 lib 目录下的 jar 文件二、压缩 rt.jar 文件参考博客 : 精简jre1.8精简jre步骤裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 ( 本篇博客的资源快照 , 不是最终版的裁剪效果 ) : https://download.csdn.net/download/han1202012/87389091 JRE 裁剪分为三…

Pytorch深度学习【十五】

微调 网络架构 一个神经网络一般可以分成两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调 思路—将相同功能的网络及其参数直接进行迁移使用,而并不是通过重新学习,只改变部分层次即可 训练 是一个目标数据集上的正常训练任务…

老杨说运维 | 2023,浅谈智能运维趋势(二)

(文末附视频,一键观看精彩内容) 前言: 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区,老杨认为智能运维的体系化建设还需从抓牢数据治理为起点,以终为始做好规…

miniconda虚拟环境安装使用jupyter notebook及相关

一、安装jupyter 1创建miniconda虚拟环境。(前面文章讲过了) 2在创建的虚拟环境下,conda install ipython jupyter 3在该环境下执行jupyter notebook。 注意:此时打开的jupyter notebook内核Python 3(ipykernel)对应该虚拟环境&am…

数据安全治理 1

数据安全治理应以数据为中心,多元化主体共同参与,兼顾发展与安全。 数据安全总体视图,包含了体系,维度,目标,实践。 制度建设 技术体系,如加密、脱敏等手段,进行数据全生命周期的管…

盘点:2022年豆瓣评分8.0以上的计算机书籍有哪些?

2022年已经结束 ,小编来盘点一下过去一年里出版的计算机图书里,有哪些计算机书籍是豆瓣评分8.0以上图书。 1、人工智能:现代方法(第4版)(上下册) ​ 系统性总结人工智能的方方面面,…

寒假每日一题2023——4261. 孤独的照片

写在前面 题目来源:AcWing 寒假每日一题2023活动 链接:https://www.acwing.com/problem/content/description/4264/ 题目 Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛&#x…

论文解读12——NGBoost: Natural Gradient Boosting for Probabilistic Prediction

目录1、文章贡献2、评分规则3、自然梯度4、自然梯度提升算法NGBoost1、文章贡献 由吴恩达团队提出的NGBoost是一种通过梯度提升进行概率预测的算法,与经典的回归模型返回一个点估计结果不同,概率回归模型返回全概率分布,将条件分布的参数视为…

Windows系统安装jenkins服务 war包形式

1.首先下载 jenkins war包 注意和jdk 的版本匹配 https://www.jenkins.io/zh/download/ 2.配置jenkins环境变量 如果不配置环境变量, jenkins的主目录默认生成在c盘下 环境变量怎么配? 请自行百度 3.运行jar包 注意修改war包路径 java -jar /data/jenkins/jenkins.war…

DNS原理与搭建(一)

文章目录一、DNS的概念与原理二、DNS私服搭建一、DNS的概念与原理 概念 DNS指的是域名服务器,就是将域名转换成IP[或者将IP转换成域名];当我们在浏览器中输入域名并按下回车,会对我们输入的域名进行解析,并返回一个IP地址,在通过…

Deepin系统深度学习环境配置指南

Deepin深度操作系统在众多Linux发行版本中深受欢迎,在实用性和专业方面到达了很好的均衡,该系统软件适配丰富支持很多第三方软件,增加了系统任务的灵活性。在装好该系统后,如何在该系统上进行深度学习代码训练调试,这就…

网络编程.

文章目录一、概述通信要素一:IP和端口号IP端口号通信要素二:网络协议TCP网络编程UDP网络编程URL网络编程每日一考一、概述 1、网络编程中两个主要问题: 如何定位网上的一台或多台主机,定位主机上的特定应用 找到主机后&#xff0…

北京化工大学1/17寒假集训题解(>1800)

目录 A - 文艺平衡树 B - 可持久化文艺平衡树 C - 可持久化平衡树 主要思路:FHQ Treap 可持久化 D - 维护数列 初始化 Insert操作 Delete操作 Reverse操作 Make-Same操作 Get-Sum操作 Max-Sum操作 懒标记的处理 E - 文本编辑器 A - 文艺平衡树 这里的…

贪心策略(二)兑换零钱(最后还得是动规)

兑换零钱(一)_牛客题霸_牛客网 兑换零钱(二)_牛客题霸_牛客网 兑换零钱(一)_牛客题霸_牛客网 描述 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要…

C++程序设计——类和对象II

一、再谈构造函数 1.构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量赋一个合适的初始值。 虽然上述构造函数调用后,对象中已经有了初始值,但是不能将其称之为类对象成员的初始化,构造函数…