socket建立客户端服务器程序

在python标准库中,使用socket模块中提供的socket对象,就可以i在计算机网络中建立服务器和客户端,并且能够进行通信,服务器端需要建立一个socket对象,并等待客户端的连接,客户端使用socket对象与服务器进行连接,一旦连接成功,客户端和服务器就可以进行通信了

socket模块中的socket对象是socket网络编程中的基础对象,原型如下:

socket(family,type,proto)
family: 地址簇,可选参数,默认为AF_INET(IPV4),也可以是AF_INET6或AF_UNIX;
type: socket类型,可选参数,默认为: SOCK_STREAM(TCP协议),可用SOCKET_DGRAM(UDP协议)
proto: 协议类型,可选参数,默认为0socket客户端对象主要应用以下这些常用方法:
1.bind(host,port): 其参数是由ip地址和端口组成的元组,例如:(127.0.0.1,8888)。如果ip地址为空,则表示本机,它的作用是使socket和服务器相关联2.listen(backlog): 参数backlog指定在拒绝连接之前,操作系统允许他的最大连接数,最小值为0,就是说已经连接了一个客户端,然后还可以连接几个,即同时连接的客户端数量; 该方法会将socket设置为服务器模式, 之后就可以调用以下的accept()方法等待客户端连接了3.accept(): 被动模式,它会等待客户端来连接,并返回一个新的套接字对象和一个客户端的地址信息4.close(): 关闭, 这个方法的作用是关闭该socket,停止本程序与服务器或客户端的连接5.recv(buffersize,[flag]):  接收数据, 用来接收远程连接发来的信息,返回该信息,buffersize设置缓冲区大小6.send(): 用于向连接的远端发送信息,data应该是bytes类型的数据, 其返回值为已传送的字节数socket建立的基本顺序如下:s=socket()--->s.bind()--->s.listen()--->c,a=s.accept()--->c.recv()/c.send()--->s.close()
建立套接字  绑定localhost     监听          等待连接           接收    发送      关闭socket

使用TCP协议连接会话

实例1-1:服务器socket的代码如下

import socket
HOST=''   #这个设置为本机ip地址
PORT='8888'  #这个是本机的端口
#建立套接字,基于IPV4和TCP协议的
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.bind((HOST,PORT))  #绑定本地的ip和端口
s.listen(5) #最大同时连接数量
#accept()返回一个新的套接字和一个地址信息,conn为新套接字,addr是地址信息
conn,addr=s.accept()  
print(f"新的套接字为: {conn},地址为: {addr}")
while True:  #循环为死循环,无限接收数据data=conn.recv(1024)  #1024是接收的最多1024字节的数据,数据赋值给dataif not data:  #如果数据为空,没有数据,就执行结束breakprint(f"从{addr}接收到的数据为:")conn.send("data")  #将数据再发回到客户端
conn.close()#关闭运行#此程序会一直运行,接收数据,直到接收的data为空,跳出循环,关闭socket

实例1-2:客户端socket的代码如下:

        相比较用socket来建立服务器而言,建立客户端程序要简单的多,当然也要创建一个socket实例,而后调用这个socket实例的connect()方法来连接服务器即可,可以理解connect()是一个主动的方法,原型如下:

connect(address)
参数address通常为一个元组(由一个主机名/ip地址,端口构成),当然连接本地计算机的话,主机名可以直接使用localhost,它用于将socket连接到远程以address为地址的计算机,
s=socket()--->s.connect()--->c.recv()/c.send()--->s.close()
建立套接字     连接服务器       接收数据 发送数据    关闭socket

client代码如下:

import socket
HOST='10.10.1.1'   #服务器的IP地址
PORT=8888    #要链接的服务器的端口
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))  #这里类似server的s,bind()
data='你好'
while data:  #data为true进入循环
#data进行utf-8的字节编码,sendall和send不同德是,sendall会确保所有数据发送出去,或在错误时抛出异常s.sendall(data.encode('utf-8'))  data=s.recv(1024)  #接收德最大字节print(f'来自服务器返回德数据: \n{data.decode('utf-8')}')data=input("请输入要发送给socket服务器的内容:")
s.colse() 

使用UDP连接会话

通过使用socket传输的UDP协议建立服务器与客户程序,从步骤上看,要比使用TCP协议简单一些,发送和接收数据使用socket对象的主要方法如下:

recvfrom(buffersize,[flag]) #buffersize用来设置缓冲区大小
sendto(bytes,address) #发送data数据和地址信息参数bytes是要发送的数据,address是要发送信息的目标地址,也是由ip地址和端口构成的元组,主要用来通过UDP协议将数据发送到指定的服务器端使用socket建立基于UDP协议的服务器流程:
s=socket()--->s.bind()--->s.sendto()/s.recvfrom()--->s.close()
建立套接字     绑定ip地址      发送      接收         关闭套接字使用socket建立的基于UDP协议的客户端流程:s=socket()--->s.sendto()/s.recvfrom()--->s.close()
建立套接字        发送          接收         关闭套接字可以看出,UDP和TCP的区别就是,基于UDP协议的服务器与客户端进行数据传时,不是先建立连接,而是直接进行数据传送

实例1-1:服务器使用UDP搭建socket

import socket
HOST=''
PORT='8888'
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((HOST,PORT))
while True:data,address=recvfrom(1024)if data==b'bye':breakprint("客户端发来的数据:\n",data.decode('utf-8'))s.sendto(date,address)
s.close()

实例1-2:客户端使用UDP搭建socket

import socket
HOST='10.10.1.1'  #socket服务器的ip地址
PORT=8888    #socket服务器的端口号
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
data="你好!"
while data:s.sendto(data.encode('utf-8'),(HOST,PORT))if data==b'bye':breakdata,address=s.recvfrom(1024)print("服务器返回的数据:",data.decode('utf-8'))data=input("请输入发送到socket服务器的数据:\n")
s.close()

代码说明:客户端创建socket后,直接向服务器端发送数据,而没有进行连接,当用户输入bye的时,程序退出循环,关闭socket

使用socketserver模块搭建服务器

虽然使用socket模块可以创建服务器,但是程序员要对包括网络连接等进行管理和编程,为了更加方便的创建网络服务器,python标准库提供了一个创建网络服务器的框架---socketserver

socketserver框架将处理的亲求划分为两个部分,分别对应服务器类和请求处理类,服务器类处理通信等问题,请求处理类处理数据交换或传送,这样,更加容易进行网络编程和程序的扩展,同时,该模块还支持快速的多线程或者多进程的服务器编程

socketsserver模块中使用的服务器类主要有TCPserver、UDPserver、ThreadingTCPserver、ThreadingUDPserver、ForkingTCPserver、FockingUDPserver等,其中有TCP字符的就是使用TCP协议的服务器类,有UDP协议的服务器类,有Threading字符的是多线程服务器类,有Forking字符的是多进程服务器类,要创建不同类型的服务器程序,只需继承其中之一或直接实例化,然后调用服务器类方法, serve_forever((),这些服务器的构造方法参数有:

server_address                #由ip地址和端口构成的元组

requestHandlerClass        #处理器类,供服务器类调用处理数据

socketserver模块中使用处理器类主要有StreamRequestHandler和DatagramRequestHandler,只要继承其中之一,就可以i自定义一个处理器类,通过覆盖以下三种方法,实现自定义

setup()          为请求准备请求处理器(请求处理的初始化工作)

handler()       完成具体的请求处理工作

finish()         清理请求处理器相关数据

使用socket模块来搭建TCP协议的服务器

import socketserver  #导入模块class myserver(socketserver.BaseRequestHandler):def handle(self):print("conn是:",self.request)  #调用父类中的requestprint("addr is",self.client_address)while True:try:  #捕获消息data=self.request.recv(1024)  #相当于s.recv(1024)if not data: #如果data为空,那么就结束循环breakprint("客户端发来的信息是:",data.decode())self.sendall(data.encode())except Exception as e:print(e)break
if __name__=='__main__':s=socketserver.ThreadingTCPServer(('10.10.1.1',8080),myserver)s.serve_forever()

实例定义了一个继承自StreamRequestHandler的处理器类,并覆盖了handler()方法,以实现数据处理,然后直接实例化了TCPserver的类,调用serve_forever()方法启动服务器

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

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

相关文章

【交叉编译】sysstat 离线编译

1、下载源码 首先从下载: https://github.com/sysstat/sysstat/tags ,我直接下载最新的 2、配置交叉编译链 快速的方法就是把整个编译包全部放在Linux ,然后编辑~/.zshrc或者~/.bashrc,在最后加入: export PATH$PATH:/opt/arm-so…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面,如果水泵站发生异常,往往会对生产生活造成诸多损失,甚至引发安全事故。因此,建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前,我国大…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…

2024.12.30(多点通信)

作业&#xff1a; 1、将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收信息实验。 发送端 #include <myhead.h>#define PORT 8888 #define IP "192.168.124.255"int main(int argc, const char *argv[]) {//1、…

Python爬虫 - 豆瓣电影排行榜数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的分类1.2 分析要爬取的单个电影的数据1.3 分析如何获取单个电影数据1.3.1 预览数据1.3.2 查看请求网址、方法及请求头信息1.3.3 查看请求参数 2. 数据用途2.1 统计分析2.2 探索性数据分析 (EDA)2.3 高…

爬虫后的数据处理与使用(处理篇)

紧接上文爬虫&#xff0c;我们获取到了一些数据&#xff0c;接下来就是使用和分析了~爬虫阶段式教学——从数据获取到格式化存储&#xff08;附代码与效果图&#xff09;_爬虫网页数据格式化-CSDN博客 为保证数据的正确性和有效性需要对数据进行筛选&#xff0c;保存有效信息&a…

模电面试——设计题及综合分析题0x01(含答案)

1、已知某温控系统的部分电路如下图&#xff08;EDP070252&#xff09;&#xff0c;晶体管VT导通时&#xff0c;继电器J吸合&#xff0c;压缩机M运转制冷&#xff0c;VT截止时&#xff0c;J释放&#xff0c;M停止运转。 &#xff08;1&#xff09;电源刚接通时&#xff0c;晶体…

基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 2ASK调制解调 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR8db 设置SNR20db 整体波形效果&…

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…

【算法day27】动态规划:基础2

题目引用 不同路径不同路径II整数拆分不同的二叉搜索树 1. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fin…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

PawSQL性能巡检平台 (3) - 慢查询采集和优化

在数据库运维管理中&#xff0c;慢查询一直是影响系统性能的重要因素。本文将详细介绍PawSQL数据库性能巡检平台在慢查询管理和优化方面的功能特性&#xff0c;帮助数据库管理员更好地应对性能挑战。 一、PawSQL巡检平台慢查询管理概述 PawSQL平台提供了全面的慢查询管理功能&…

检索增强生成(RAG)的全面综述:演进、当前格局与未来方向

摘要 https://arxiv.org/pdf/2410.12837 本文全面研究了检索增强生成&#xff08;RAG&#xff09;&#xff0c;追溯了其从基础概念到当前最先进技术的演变历程。RAG将检索机制与生成式语言模型相结合&#xff0c;以提高输出的准确性&#xff0c;从而解决了大型语言模型&#…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

拓展C盘内存的方法(C盘旁边不一定是D盘)

问题&#xff1a; 比如&#xff1a;windows现在C盘200GB&#xff0c;D盘600GB&#xff0c;准备额外拓展一个新的盘2TB&#xff0c;如何把新的盘中500GB拓展到C盘中 总结&#xff1a; 通过磁盘管理&#xff1a;如果C盘旁边有未分配空间&#xff0c;可以直接使用“扩展卷”功能…

基于springboot的膳食问答系统的设计与实现

摘 要 本文介绍了一个基于SpringBoot框架的膳食问答系统&#xff0c;该系统融合了文章查看、膳食问答、用户管理、文章管理、知识点管理、系统日志查看、在线用户查看以及办公管理等多项功能。系统采用主流界面设计风格&#xff0c;前端使用HTML构建用户界面&#xff0c;后端则…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中&#xff0c;ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成&#xff08;例如Microsoft Excel、Word、Internet Explorer等&#xff09;。以下是一些建议&#xff0c;帮助您更好地在LabVIEW中使用ActiveX控件&#xff1a; ​ 1. 理解ActiveX控件的基本原…