草庐IT

Python网络编程之TCP编程

ζ小菜鸡 2024-03-21 原文

Python网络编程之TCP编程


一、前言

  由于TCP连接具有安全可靠的特性,所以TCP应用更为广泛。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的服务叫服务器。例如,当我们在浏览器中访问百度时,我们自己的计算机就是客户端,浏览器会主动向百度的服务器发起连接。如果一切顺利,百度的服务器接受我们的连接,一个TCP连接就建立起来了,后面的通信就是发送网页内容了。


二、创建TCP服务器

  创建TCP服务器的过程,类似于生活中接听电话的过程。如果要接听别人的来电,首先需要购买一部手机,然后安装手机卡。接下来,设置手机为接听状态,最后静等对方来电。

  如同上面的接听电话的过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

  • 使用socket()创建一个套接字
  • 使用bind()绑定IP和port
  • 使用listen()使套接字变为可被动连接
  • 使用accept()接收发送数据
  • 使用recv/send()接收发送数据

  例如,使用socket模块,通过客户端浏览器向本地服务器(IP地址为127.0.0.1)发起请求,服务器接到请求,向浏览器发送“Hello World”。具体代码如下:

# -*- coding: utf-8 -*-
import socket  # 导入socket模块

host = "127.0.0.1"  # 主机IP
port = 8080  # 端口号
web = socket.socket()  # 创建socket对象
web.bind((host, port))  # 绑定端口
web.listen(5)  # 设置最多连接数
print("服务器等待客户端连接……")
# 开启死循环
while True:
    conn, addr = web.accept()  # 创建客户端连接
    data = conn.recv(1024)  # 获取客户端请求数
    print(data)  # 打印接收到的数据
    conn.sendall(b"HTTP/1.1 200 OK\r\n\r\nHello World")  # 向客户端发送数据
    conn.close()  # 关闭连接

  运行结果如下图所示:

  然后打开谷歌浏览器,输入网址:127.0.0.1:8080(服务器的地址:127.0.0.1,端口号是8080),成功连接服务器以后,浏览器显示“Hello World”。如下图所示:


三、创建TCP客户端

  TCP的客户端要比服务器简单很多,如果说服务器是需要自己买手机、查手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。

  在实例1中,我们使用浏览器作为客户端接收数据,下面,创建一个tcp客户端,通过该客户端向服务器发送和接收消息。创建一个client.py文件,具体代码如下:

# -*- coding: utf-8 -*-
import socket  # 导入socket模块

s = socket.socket()  # 创建TCP/IP套接字
host = "127.0.0.1"  # 获取主机地址
port = 8080  # 设置端口号
s.connect((host, port))  # 主动初始化TCP服务连接
send_data = input("请输入要发送的数据:")  # 提示用户输入数据
s.send(send_data.encode())  # 发送TCP数据
# 接收对方发送过来的数据,最大接收1024个字节
recvData = s.recv(1024).decode()
print("接收到的数据为:", recvData)
# 关闭套接字
s.close()

  先运行实例1中的server.py文件,然后运行client.py文件。接着,在client.py窗口输入“hi”,此时server.py窗口会接到消息,并且发送“Hello World”。运行结果如图所示:


四、执行TCP服务器和客户端

  在上面的例子中,我们设置了一个服务器和客户端,并且实现了客户端和服务器之间的通信。根据服务器和客户端的执行流程,可以总结出TCP客户端和服务器的通信模型,如图所示:

  既然客户端和服务器可以使用Socket进行通信,那么,客户端就可以向服务器发送文字,服务器接收到消息后,显示消息内容并且输入文字返回给客户端。客户接收到响应,显示该文字,然后继续向服务器发送消息。这样,就可以实现一个简易的聊天窗口。当有一方输入“byebye”时,则退出系统,中断聊天。

  (1)创建server.py文件,作为服务器程序,具体代码如下:

# -*- coding: utf-8 -*-
import socket  # 导入socket模块

host = socket.gethostname()  # 获取主机地址
port = 12345  # 设置端口号
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建TCP/IP套接字
s.bind((host, port))  # 绑定地址(host, port)到套接字
s.listen(1)  # 设置最多连接数
sock, addr = s.accept()  # 被动接收TCP客户端连接
print("连接已建立")
info = sock.recv(1024).decode()  # 接收客户端数据
while info != "byebye":  # 判断是否退出
    if info:
        print("接收到的内容:" + info)
    send_data = input("输入发送内容:")  # 发送消息
    sock.send(send_data.encode())  # 发送TCP数据
    if send_data == "byebye":  # 如果发送byebye,则退出
        break
    info = sock.recv(1024).decode()  # 接收客户端数据
sock.close()  # 关闭客户端套接字
s.close()  # 关闭服务器套接字

  (2)创建client文件,作为客户端程序,具体代码如下:

# -*- coding: utf-8 -*-
import socket  # 导入socket模块

s = socket.socket()  # 创建TCP/IP套接字
host = socket.gethostname()  # 获取主机地址
port = 12345
s.connect((host, port))  # 设置端口号
print("已连接")  # 主动初始化TCP服务器连接
info = ""
while info != "beybey":  # 判断是否退出
    send_data = input("输入发送内容:")  # 输入内容
    s.send(send_data.encode())
    if send_data == "beybey":
        break
    info = s.recv(1024).decode()  # 接收服务器数据
    print("接收到的内容:" + info)
s.close()  # 关闭套接字

  分别运行server.py和client.py文件,如图所示



  接下来,在client窗口,输入“菜鸡菜鸡,我是菜鸟”,然后按下《Enter》键,此时将显示client.py窗口发送消息,并提示server.py窗口输入内容,如图所示:


  当输入“byebye”时,结束对话,如图所示:


有关Python网络编程之TCP编程的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐