Python网络编程:socket模块的入门与实践

Socket模块的基本概念

创建Socket

在Python中,可以使用socket模块创建Socket对象:

import socket# 创建一个TCP/IP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

地址族与Socket类型

  • socket.AF_INET:IPv4地址族

  • socket.SOCK_STREAM:TCP流套接字

  • socket.SOCK_DGRAM:UDP数据报套接字

TCP编程

TCP服务器

以下是一个简单的TCP服务器示例,它接收客户端连接并返回一个简单的消息:

import socketdef tcp_server():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((host, port))s.listen(5)print(f"服务器启动,监听端口 {port}")while True:conn, addr = s.accept()print(f"连接地址: {addr}")conn.send(b"欢迎访问服务器!")conn.close()if __name__ == "__main__":tcp_server()

TCP客户端

以下是一个简单的TCP客户端示例,它连接到服务器并接收消息:

import socketdef tcp_client():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))message = s.recv(1024)print(f"从服务器接收: {message.decode()}")s.close()if __name__ == "__main__":tcp_client()

UDP编程

UDP服务器

以下是一个简单的UDP服务器示例,它接收客户端消息并返回响应:


import socketdef udp_server():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind((host, port))print(f"UDP服务器启动,监听端口 {port}")while True:data, addr = s.recvfrom(1024)print(f"收到来自 {addr} 的消息: {data.decode()}")s.sendto(b"已收到消息", addr)if __name__ == "__main__":udp_server()

UDP客户端

以下是一个简单的UDP客户端示例,它发送消息到服务器并接收响应:

import socketdef udp_client():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)message = "你好,服务器"s.sendto(message.encode(), (host, port))data, addr = s.recvfrom(1024)print(f"从服务器接收: {data.decode()}")s.close()if __name__ == "__main__":udp_client()

错误处理

在网络编程中,处理可能出现的错误是非常重要的。可以使用try-except语句来捕获和处理异常。

import socketdef tcp_client_with_error_handling():host = '127.0.0.1'port = 12345try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))message = s.recv(1024)print(f"从服务器接收: {message.decode()}")except socket.error as e:print(f"Socket 错误: {e}")finally:s.close()if __name__ == "__main__":tcp_client_with_error_handling()

高级Socket编程

多线程TCP服务器

使用多线程可以处理多个客户端连接。

import socket
import threadingdef handle_client(conn, addr):print(f"连接地址: {addr}")conn.send(b"欢迎访问服务器!")conn.close()def tcp_server_multithreaded():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((host, port))s.listen(5)print(f"服务器启动,监听端口 {port}")while True:conn, addr = s.accept()client_thread = threading.Thread(target=handle_client, args=(conn, addr))client_thread.start()if __name__ == "__main__":tcp_server_multithreaded()

非阻塞Socket

非阻塞Socket允许在没有数据时立即返回,而不是等待数据。


import socketdef non_blocking_client():host = '127.0.0.1'port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setblocking(0)try:s.connect((host, port))except BlockingIOError:passwhile True:try:message = s.recv(1024)if message:print(f"从服务器接收: {message.decode()}")breakexcept BlockingIOError:continues.close()if __name__ == "__main__":non_blocking_client()

实际应用示例

简单的聊天室

可以通过TCP编写一个简单的聊天室,服务器接收消息并广播给所有连接的客户端。

聊天服务器

import socket
import threadingclients = []def broadcast(message, client_socket):for client in clients:if client != client_socket:try:client.send(message)except:clients.remove(client)def handle_client(client_socket):while True:try:message = client_socket.recv(1024)if message:print(f"收到消息: {message.decode()}")broadcast(message, client_socket)except:clients.remove(client_socket)client_socket.close()breakdef chat_server():host = '127.0.0.1'port = 12345server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(5)print(f"聊天服务器启动,监听端口 {port}")while True:client_socket, addr = server_socket.accept()print(f"连接地址: {addr}")clients.append(client_socket)client_thread = threading.Thread(target=handle_client, args=(client_socket,))client_thread.start()if __name__ == "__main__":chat_server()
聊天客户端
import socket
import threadingdef receive_messages(client_socket):while True:try:message = client_socket.recv(1024)if message:print(message.decode())except:breakdef chat_client():host = '127.0.0.1'port = 12345client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect((host, port))receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))receive_thread.start()while True:message = input()client_socket.send(message.encode())if __name__ == "__main__":chat_client()

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

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

相关文章

#systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生

仿真调度系列文章,已经编写10篇,写到这里,相比大家都已经对VCS仿真工具的运行机制,有了大体了解。学无止境,而且真正的仿真调度行为控制,是每个EDA厂商自己产品的高度机密。言外之意,我们要抱着谦虚的态度说:我们只是懂了一点点。 一 RTL仿真中的竞争现象 在实际仿真…

【信号分解】基于极点对称模态分解ESMD实现信号分解附Matlab代码

% 导入信号数据 load(‘signal_data.mat’); % 假设信号数据保存在signal_data.mat文件中 % 构建ESMD函数 esmd (x) esmd_decomposition(x); % 对信号进行ESMD分解 components esmd(signal_data); % 显示分解结果 figure; subplot(length(components)1,1,1); plot(signal_…

lua 写一个 不同时区之间转换日期和时间 函数

这个函数用于调整时间戳以适应不同的时区。它接受五个参数:format、timeStamp、dontFixForTimeOffset、currentServerTimeZone和showLog。返回 os.date,可以转化成指定格式的年月日时间 ### 功能 该函数的主要功能是根据给定的时区偏移量调整时间戳&am…

springSecurity学习之springSecurity过滤web请求

过滤web请求 在spring中存在一个DelegatingFilterProxy,是一种特殊的Filter,主要任务就是将工作委托给Filter实现类 使用EnableWebSecurity注解时引入FilterChainProxy Bean(name AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) pub…

使用Amazon Web Services Lambda把天气预报推送到微信

最近北京开始下雨,开始和同事打赌几点能够雨停,虽然Iphone已经提供了实时天气,但是还是想用国内的API试试看看是不是更加准确些。 以下是我使用的服务: 地图SDK/APP获取 经纬度彩云天气API 通过地理位置获取天气信息Lambda 作为…

关于Mysql的面试题(实时更新中~)

一、主键约束与“not null unique”区别 1、作为Primary Key的域/域组不能为null,而Unique Key可以。 2、在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而prima…

buu做题(6)

目录 [GWCTF 2019]我有一个数据库 [WUSTCTF2020]朴实无华 [GWCTF 2019]我有一个数据库 什么都没有, 尝试用dirsearch扫一下目录 可以扫到一个 /phpmyadmin 可以直接进入到数据库里面 但里面没什么东西 可以看到它的版本不是最新的, 搜一下相关的漏洞 phpMyAdmin 4.8.1后台文…

go关于string与[]byte再学深一点

目标:充分理解string与[]bytes零拷贝转换的实现 先回顾下string与[]byte的基本知识 1. string与[]byte的数据结构 reflect包中关于字符串的数据结构 // StringHeader is the runtime representation of a string.type StringHeader struct {Data uintptrLen int} …

ClickHouse 入门(一)【基本特点、数据类型与表引擎】

前言 今天开始学习 ClickHouse ,一种 OLAP 数据库,实时数仓中用到的比较多; 1、ClickHouse 入门 ClickHouse 是俄罗斯的 Yandex(搜索引擎公司)在 2016 年开源的列式存储数据库(HBase 也是列式存储&#xf…

Linux C服务需要在A服务和B服务都启动成功后才能启动

需求 C服务需要在A服务和B服务都启动成功后才能启动 服务编号服务名服务Anginx.service服务Bmashang.service服务Credis.service 实验 如果您想要 redis.service 在 nginx.service 和 mashang.service 都成功启动后才能启动,那么需要在 redis.service 的服务单元…

67| 上海市互联网行业招聘数据集的构建与可视化分析

一、数据集介绍 数据集概述 数据集文件可见 上海市互联网行业招聘数据集(

赞扬的10条原则

来自刘澜《领导力就是说对十句话》 1) 赞扬的第一个原则,是赞扬要具体。不要只是说“你做得真好”,而 是要具体说你到底做了什么,怎么做得好。 2)赞扬的第二个原则,是赞扬行为,而非品质。你赞扬…

某宝同款度盘不限速后台系统源码

简介: 某宝同款度盘不限速后台系统源码,验证已被我去除,两个后端系统,账号和卡密系统 第一步安装宝塔,部署卡密系统,需要环境php7.4 把源码丢进去,设置php7.4,和伪静态为thinkphp…

山东济南十大杰出人物起名大师颜廷利:影响世界的思想家哲学家教育家

在宇宙的广袤舞台上,各类智者以他们独特的方式揭示着世界的奥秘。数学家们在无尽的符号与公式中穿梭,像探索者般解锁着自然界的深层逻辑。考古学家们则跋涉于古老的土地,用他们的双手拂去岁月的尘埃,让沉睡的历史重见天日。 二十一…

spss是什么软件?spss有什么用

spss是什么软件? SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如…

LeetCode 第407场周赛个人题解

目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…

汽车免拆诊断案例 | 2017 款林肯大陆车发动机偶尔无法起动

故障现象 一辆2017款林肯大陆车,搭载2.0T发动机,累计行驶里程约为7.5万km。车主进厂反映,有时按下起动按钮,起动机不工作,发动机无法起动,组合仪表点亮正常;多次按下起动按钮,发动机…

ubuntu 挂载硬盘,raspberry pi 树莓派,jetson

在Ubuntu中挂载硬盘,首先需要确认硬盘是否被系统识别,可以通过lsblk或fdisk -l命令查看。假设新硬盘被系统识别为/dev/sdb,你可以按照以下步骤进行挂载: 创建一个挂载点(例如在/mnt下): sudo …

deque学习笔记

构造函数 //双端数组 #include<iostream> #include<deque> using namespace std; //deque内部有一个中控器 void printDeque(deque<int>& d) {for (deque<int> ::iterator it d.begin(); it ! d.end(); it) {cout << *it << " …

(21)起落架/可伸缩相机支架

文章目录 前言 1 连接到自动驾驶仪 2 通过任务规划器设置 3 其他参数 4 参数说明 前言 Copter 和 Plane 支持可伸缩的起落架/相机支架&#xff0c;由伺服机制激活&#xff08;如 Hobby King 出售的用于copters 的这些&#xff09;。齿轮/支架可以手动缩回或用一个辅助开关…