python入门开发学习笔记之socket tcp / udp 通信实例

matlab与python SOCKET通信——UDP方法与TCP方法 前言 UDP方法 tcp方法前言  目前的正在做的项目是打算把ARM端的数据传到PC上好做算法,考虑的方案是ARM使用python,PC端使用matlab,用TCP或者UDP协议传输,先写了几个简单的例程,试了试效果,中途遇到了一些问题,本来关于python和matlab之间的网络通信的资料就挺少的,所以在博客上记录一下(需要注意,我这里的python使用的是3.5,所以在语法上和2.7略有不同,比 阅读详情

本节重点:

  • 使学生掌握基本的socket tcp / udp 通信实例
  • 让学生可通过socket写一个简单的聊天的例子

本节时长需控制在70-80分钟内

基本Socket例子(10-15分钟)

做了这么久的铺垫,是时候该与远方的她say hi啦

Server

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port

sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind((HOST, PORT))

sock_server.listen(1) #开始监听,1代表在允许有一个连接排队,更多的新连接连进来时就会被拒绝
conn, addr = sock_server.accept() #阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象

with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024) #接收1024个字节
        if not data: break #收不到数据,就break
        conn.sendall(data) #把收到的数据再全部返回给客户端

Client

# Echo client program
import socket

HOST = 'localhost'    # The remote host
PORT = 50007              # The same port as used by the server

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
client.sendall(b'Hello, world')

data = client.recv(1024)

print('Received',data)

先启动server端,再启动client端,看结果

此时一定要停下来,让学生自己写一遍!

循环收发数据(15-20分钟)

第一次接触就这么交待了,只说了一句话,感觉不够过瘾,如何实现更多的交互呢?简单,只需要让客户端不断的发,服务端不断的收就可以了,写个循环搞定

server

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port

sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind((HOST, PORT))

sock_server.listen(1) #开始监听,1代表在允许有一个连接排队,更多的新连接连进来时就会被拒绝
conn, addr = sock_server.accept() #阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象

with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024) #接收1024个字节
        print("server recv:",conn.getpeername(), data.decode())
        if not data: break #收不到数据,就break
        conn.sendall(data) #把收到的数据再全部返回给客户端

client

# Echo client program
import socket

HOST = 'localhost'    # The remote host
PORT = 50007              # The same port as used by the server

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

while True: 

    msg = input(">>>:").strip()
    if len(msg) == 0:continue

    client.sendall(msg.encode()) #发送用户输入的数据,必须是bytes模式

    data = client.recv(1024)

    print('Received',data.decode()) #收到服务器的响应后,decode一下

此时一定要停下来,让学生自己写一遍!

简单聊天软件(5分钟)

为什么上面的那个例子里,我跟杠娘说什么,她就回复什么,这哪叫聊天呀,这种事需要双方尽全力配合才行呀,那就让服务端也能说话

Server

import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port

sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind((HOST, PORT))

sock_server.listen(1) #开始监听,1代表在允许有一个连接排队,更多的新连接连进来时就会被拒绝
conn, addr = sock_server.accept() #阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象

with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024) #接收1024个字节
        print("recv from Alex:",conn.getpeername(), data.decode())
        if not data: break #收不到数据,就break

        response = input(">>>").strip()
        conn.send(response.encode())
        print("send to alex:",response)

client不需要做更改,直接 看结果

冷静的海峰玩了一会这个程序说,Alex你这个有bug,双方只能一来一往的说话,如果你想连续发2句话是不行的,就卡住了。

对,海峰你说的没错,之所以连续发第2次时会卡住 ,是因为你发了一条消息后,就去调用recv方法接收服务器的响应了,在服务器端返回消息之前,这个recv(1024)方法是阻塞的,如果想允许此时还能再发消息给服务器端,就需要再单独启动一个线程,只负责发消息。当然这就得等我们掌握了线程知识再学啦,此处不多赘述。

此处补充下listen(1)的演示,就是启动多个客户端连接同一个服务端,发现服务端只能同时处理一个请求

聊天软件升级版(20-25分钟)

刚才在聊天的时候,你会发现,服务端(杠娘)在服务客户端(Alex)的时候,其它人如果也想跟杠娘连接是处于排队状态,然后等Alex完事并断开后,下一个人就跟上,但实际情况是客户端一断开,服务端也跟着断了。

为什么会断呢?因为服务端以下代码的意思是, 如果收不到数据,就跳出循环,就断开了呀

conn, addr = sock_server.accept() #阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象

with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024) #接收1024个字节
        print("recv from Alex:",conn.getpeername(), data.decode())

        if not data: break #收不到数据,就break , 就是它干的

        response = input(">>>").strip()
        conn.send(response.encode())
        print("send to alex:",response)

想实现一个客户端断开后,可以立刻接入另外一个客户端的话,怎么办呢?只需再在外层加个循环

while True: #最外层loop 

    conn, addr = sock_server.accept() #阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象
    #为何把上面这句话也包含在循环里?
    print("来了个新客人",conn.getpeername() )

    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024) #接收1024个字节
            print("recv from :",conn.getpeername(), data.decode())
            if not data: break #收不到数据,就break
            conn.send(data.upper())
            print("send to alex:",data)

break跳出后就回到大while那层[

此时一定要停下来,让学生自己写一遍!

问题:

有的同学在重启服务端时可能会遇到

这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法)

解决方法1:

sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #一行代码搞定,写在bind之前
sock_server.bind((HOST, PORT))

解决方法2:

发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决,
vi /etc/sysctl.conf

编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

此方法全栈班的学生可直接忽略

UDP实例(15-20分钟)

udp 不需要经过3次握手和4次挥手,不需要提前建立连接,直接发数据就行。

server端

import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #udp类型

udp_server_client.bind(ip_port)

while True:
    msg,addr=udp_server_client.recvfrom(BUFSIZE)
    print("recv ",msg,addr)

    udp_server_client.sendto(msg.upper(),addr)

client端

import socket
ip_port = ('127.0.0.1',9000)
BUFSIZE = 1024
udp_server_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    msg=input('>>: ').strip()
    if not msg:continue
    udp_server_client.sendto(msg.encode('utf-8'),ip_port)

    back_msg,addr = udp_server_client.recvfrom(BUFSIZE)
    print(back_msg.decode('utf-8'),addr)

演示

此时一定要停下来,让学生自己写一遍!

TCP VS UDP(5分钟)

tcp基于链接通信

  • 基于链接,则需要listen(backlog),指定连接池的大小
  • 基于链接,必须先运行的服务端,然后客户端发起链接请求
  • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
  • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)

udp无链接

  • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
  • 无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
  • recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
  • 只有sendinto发送数据没有recvfrom收数据,数据
【Socket】Python UDP和TCP的socket实例 [TOP]Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 具体定义看百科 socket有两种,一种基于UDP,一种基于TCP。UDP是面向非连接的,传递的是数据报,每次传递都要指定目的地址端口;而TCP是面向连接的,经过三次握手协议建立起连接,所以不用每次都指定目的地址端口。当然还有很多的区别,这里就不一一列举。一般服务器端和客户端各有一个socket,你 阅读详情

相关推荐

Python学习之Socket通信的实现

一、Socket通信简介 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 这里推荐一篇大神的博客,这里讲socket通信讲的明明白白Socket通信原理,因为主要讲解底层原理,因此没...

愚公求道 5389

Python Socket通讯

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

WK攻城狮的博客 7080

Python学习,使用套接字(socket)实现UDP与TCP通信

开放式系统互联模型 官方的模型分为七层,但在实际使用中大多数公司会把这个模型分为四层或者五层。 而在python建立一个简单的主机间的通信,我们需要了解IP、UDP与TCP IP 相比IP对大多数人来说都并不陌生,IP是什么,在Windows下,我们可以通过ipconfig来查看自己的IP等相关网络配置,而在linux下我们可以通过ifconfig来查看自己的IP等相关信息 Windows环境下的ipconfig Linux环境下的ifconfig IP协议有两种,一种是我们当前较为常用的IPv4(i

sehun_sx的博客 1577

基于Python的socket库实现通信功能

这是一篇介绍使用python的socket库实现通信功能的文章.系统主要分为客户端和服务端。这里简单的给每个客户端增加一个不重复的uid,客户端之间可以根据这个uid选择进行广播通信,即与所有在线的客户端通信。也可以选择与单一客户端通信。

一只程序猿子的博客 5389

TCP/UDP程序开发

TCP/UDP程序开发 一、实验课时 8学时 二、实验目的 开发TCP\UDP协议应用程序,掌握网络应用程序的工作原理。通过本实验,深入理解TCP和UDP协议的异同点,了解网络协议的工作过程,学会网络通讯编程的基本方法,能够编制网络应用程序。 三、实验内容 (1)了解和掌握“基于UDP—面向无连接的应用程序”和“基于TCP—面向连接的应用程序”的运行机制和编程方法 (

携手凡生的博客 1416

Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细)

Carsim与Simulink联合仿真成功

强强的博客 3万+

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

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

weixin_46274756的博客 8080

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1259

Python实现基本Socket服务端与客户端通信

该文章使用 python 实现基本的 socket 服务端与客户端通信,分步详解与完整代码都有,按需所求即可。

weixin_52212950的博客 6441

MTK Android 12 Clone Project 克隆项目

本文介绍了如何使用MTK Android 12 Clone Project 克隆一个新的项目。通过使用绝对路径执行Perl脚本,并根据需要选择升级或降级位数,可以成功地生成一个新的项目并进行编译。希望本文对xdm有所帮助。

我其实什么都不会 942

python实现socket通信

最近工作需要实现将树莓派处理的信号文件与工控机进行通信,然后将文件传输到工控机,并且传输完一个就删除一个。主要利用的是python的socket库,主要是将树莓派作为服务器端,工控机作为客户端,树莓派一旦监测到指定文件夹下有文件产生就进行通信传输。(1)主要是进行连接询问建立后,通过python的watchdog库实时监控指定文件夹是否有“文件生成”的事件发生,一旦有,就进行send_file。其次还有可以直接传字符流,不用再存储文件,相关代码也很好改正,在此不必赘述,根据实际情况选择需求。

qq_41732646的博客 1511

【Claude Code 源码解析教程】第25章:测试与调试

Claude Code 作为复杂的 AI 编程助手,测试与调试是保证质量的关键环节。项目建立了完善的测试体系,包括单元测试、集成测试、端到端测试等多个层次,同时提供了丰富的调试工具和技巧。

rengang66的博客 210

使用 python socket 实现UDP/TCP网络通信

1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端

ChaoChao66666的博客 6296

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

SAP Word 模板与 ABAP XML 数据流合并机制深度解析

Office Open XML 标准把一个.docx拆分成多个部件(document.xml、customXml\item1.xml 等),天然支持命名空间与 XPath;Word 在渲染时,会扫描<w:sdt>(结构化文档标签)与来确定绑定关系;在 ABAP 端,通过简单字符串替换与 XSLT 变换即可完成数据灌入,无需 COM Automation,安全且易于调试。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

python socket编程(tcp/udp)

晚点补充一下这篇文章。主要研究一下python下的tcp/udp的使用,包括收发双方;对于tcp的话要考虑循环接收。

mijichui2153的博客 6599

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1759

Python 基于TCP与UDP协议实现socket通信的简单代码实现

Python最近的热度可谓是水涨船高,在网上随便搜一搜编程语,除了老牌霸榜的JAVA以外,Python的排名也是水涨船高。虽然编程语言这种东西不应该有排名一说,适合自己的适合项目开发的就是最好的语言,但是Python最近的热度确实只增不减。作为一个python不算很厉害的小白,跟大家分享分享我觉得Python学习中还算重要的内容,不定期更新,记录下学习Python过程中的点点滴滴,也希望...

qq_36502985的博客 2517

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于python socket实现TCP/UDP通信

什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用来实现进程在网络中通信。学习网络编程的目的是为了开发基于互联网通信的软件,不论是BS架构的还是CS架构的。我们开发互联网通信软件是处于TCP/IP五层协议中的应用层,当涉及到数据需要经过互联网传输时,就需要使用到socket抽象层。这个socket抽象层不属于TCP/IP五层,是一个抽象的出来的,帮我们封装了包括传输层以下的其他各层。

nhb687096的博客 2810

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python之有趣的Socket,UDP与TCP

python socket 干货分享 : )

2405_87230434的博客 2224

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Socket:TCP/UDP通信详解

Socket编程实现进程间通信,分为UDP和TCP两种方式。UDP是无连接协议,适用于实时性要求高的场景(如视频流),通过sendto()和recvfrom()实现数据传输。TCP是面向连接的可靠协议,用于文件传输等场景,通过建立连接后使用send()和recv()通信。文章提供了Python实现的服务器和客户端代码示例:基本UDP通信、TCP单线程/多线程处理多客户端连接,以及通过服务器转发实现客户端间通信的完整方案。TCP示例展示了如何维护客户端列表并进行消息广播,实现简单的聊天功能。

Eillot666的博客 1008

Python使用套接字(socket)实现UDP与TCP通信

开放式系统互联模型 官方的模型分为七层,但在实际使用中大多数公司会把这个模型分为四层或者五层。 而在python建立一个简单的主机间的通信,我们需要了解IP、UDP与TCP IP 相比IP对大多数人来说都并不陌生,IP是什么,在Windows下,我们可以通过ipconfig来查看自己的IP等相关网络配置,而在linux下我们可以通过ifconfig来查看自己的IP等相关信息 Windows环境下的ipconfig Linux环境下的ifconfig IP协议有两种,一种是我们当前较为常用的IPv4(inet

python学习者的博客 3670

TCP通信与UDP通信记录

文章目录

时时总结,常常分享 3239

【计算机网络】python——socket编程(TCP/UDP)

Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。一个socket允许应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然。

Coco416的博客 3003
上一篇: python入门开发学习笔记之什么是socket
下一篇: python入门开发学习笔记之粘包现象与解决方案
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值