我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python3--socket编程(tcp协议)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python3--socket编程(tcp协议)

socket概念

socket层

blob.png


理解socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议

简单来说

其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。


套接字(socket)的发展史

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的


基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信


基于网络类型的套接字家族

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)


tcp协议和udp协议

.TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。


UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)


blob.png



套接字(socket)初使用

基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

windows如果不通,注意关闭防火墙

server端

import socket

sk = socket.socket()  # 实例化一个对象sk
sk.bind(('192.168.11.224', 8989))  # 把地址绑定到套接字
sk.listen()  # 监听链接

conn, addr = sk.accept()  # 接收客户端链接
print(addr)  # 打印出客户端的地址+端口
conn.send('hello'.encode('utf-8'))  # 向客户端发送信息
ret = conn.recv(1024)  # 接收客户端信息(1024字节)
print(ret.decode('utf-8'))  # 打印客户端信息(bytes类型需要decode)
conn.close()  # 关闭客户端套接字
sk.close()  # 关闭服务器套接字


client端

import socket

sk = socket.socket()  # 创建客户端套接字
sk.connect(('192.168.11.224', 8989))  # 连接服务器(ip地址+端口)

ret = sk.recv(1024)  # 接收消息
print(ret.decode('utf-8'))  # 打印接收的消息
sk.send('SB!'.encode('utf-8'))  # 向服务器发送消息(bytes)
sk.close()  # 关闭客户端套接字


选运行server端,在运行client端(顺序不能搞反了!)

server端执行结果如下

('192.168.11.224', 58040)

SB!


client端执行结果如下

hello


上面例子,只是互相发送了一次消息,就关闭了,如何互相一直发送消息?

server代码:

import socket

while True:
    sk = socket.socket()  # 实例化一个对象sk
    sk.bind(('192.168.11.224', 8989))  # 把地址绑定到套接字
    sk.listen(10)  # 监听链接
    conn, addr = sk.accept()  # 接收客户端连接信息
    print(addr)  # 打印出客户端的地址
    ret = conn.recv(1024)  # 接收客户端信息(1024字节)
    if ret.decode('utf-8').lower() == 'q':  # (一定要是client先退出,读取内容为q,则退出)
        conn.close()  # 关闭客户端套接字
        sk.close()  # 关闭服务器套接字
        break
    print(ret.decode('utf-8'))  # 打印客户端发送信息
    content = input('input>>>').strip().encode('utf-8')  # 输入需要发送的内容
    conn.send(content)  # 向客户端发送信息


client代码:

import socket

while True:
    sk = socket.socket()  # 创建客户端套接字
    sk.connect(('192.168.11.224', 8989))  # 连接服务器(ip地址+端口)

    content = input('input>>>').strip().encode('utf-8')  # 输入内容,需要encode为bytes类型
    if content.decode('utf-8').lower() == 'q':  # 当输入q的时候,退出聊天
        sk.send(content)  # 关闭前发送退出信息给server端
        sk.close()  # 关闭客户端套接字
        break
    sk.send(content)  # 向服务器发送消息(bytes)

    ret = sk.recv(1024)  # 接收消息
    print(ret.decode('utf-8'))  # 打印接收的消息

运行效果--(先执行server,在执行client)

download.gif


socket(tcp协议)编程,多人聊天

对于一个tcp连接,客户端和server对话没有结束,那么其它客户端全部都不能与服务器发消息对话

示例

server端代码

import socket

sk = socket.socket()  # 实例化一个对象sk
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 重用ip和端口
sk.bind(('127.0.0.1', 9595))  # 把地址,端口绑定到套接字(socket)
sk.listen()  # 监听连接

# 网络传输只能是二进制(bytes)类型的数据
while True:
    conn, addr = sk.accept()  # 接收客户端连接(conn为内容,addr为ip地址和端口)
    while True:
        ret = conn.recv(1024).decode('utf-8')  # 接收内容1024个字节并解码为utf-8
        if ret == 'q':
            break
        print(ret)
        inp = input('>>>').strip()
        conn.send(inp.encode('utf-8'))  # conn.send发送信息(并编码成utf-8)
        if inp == 'q':
            break
    conn.close()  # 关闭客户端连接

sk.close()  # 关闭socket连接


client端代码

import socket

sk = socket.socket()  # 实例化一个对象sk
sk.connect(('127.0.0.1', 9595))  #连接服务器(ip地址+端口)
while True:
    inp = input('>>>').strip()
    sk.send(inp.encode('utf-8'))  # 向服务器发送消息(编程成utf-8)
    if inp == 'q':
        break
    ret = sk.recv(1024).decode('utf-8')  # 接收消息(1024字节,解码成utf-8)
    if ret == 'q':
        break
    print(ret)
sk.close()  # 关闭socket连接


运行结果

download.gif


可以很明显的看到,如果第一个连接不退出的话,那么第二个连接就不能与服务器对话

总结:

tcp协议适用于 文件的上传和下载 发送邮件 发送重要文件

每和一个客户端建立连接,都会在自己的操作系统上占用一个资源

同一时间,只能和一个客户端通信

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python3--socket编程(tcp协议)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python3--socket编程(tcp协议)

socket概念socket层理解socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一
2023-01-30

python3--socket编程(udp协议)

基于UDP协议的socketudp是无连接的,启动服务之后可以直接接受消息,不需要提前建立连接,UDP必须是server端先接受消息简单版server端代码importsocket#创建一个服务器的套接字基于udp,type=socket.
2023-01-30

网络编程协议(TCP和UDP协议,粘包问

网络编程协议1.osi七层模型应用层  表示层  会话层  传输层  网络层  数据链路层  物理层2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型3.Tcp和udp协议Tcp协议:面向连接,数据可靠,传输效率低,面向字
2023-01-30

在c#中使用Socket实现一个tcp协议

这篇文章给大家介绍在c#中使用Socket实现一个tcp协议,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.
2023-06-06

Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点

可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络。弄懂协议栈的原理,无论对调试网络IO性能还是解决网络问题都是有很大帮助的。本片文章就带领大家来看看内核是如何控制网络数据流的。
Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点
2024-04-23

Python网络编程之Python编写TCP协议程序的步骤

这篇文章主要介绍了Python网络编程编写TCP协议程序的开发步骤,通过实例代码介绍了TCP客户端程序开发,案例讲解多任务版TCP服务端程序开发,需要的朋友可以参考下
2022-11-13

Android编程使用HTTP协议与TCP协议实现上传文件的方法

本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法。分享给大家供大家参考,具体如下: Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Soc
2022-06-06

TCP Socket 编程原理详解

TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它通过建立一条虚拟的、全双工的通信管道来实现数据的可靠传输。在TCP Socket编程中,需要了解以下几个关键概念和原理:1. Socket:Socket是一种通信的接口,它定义了数据
2023-09-01

python中怎么用socket实现协议TCP长连接框架

这篇文章主要介绍“python中怎么用socket实现协议TCP长连接框架”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么用socket实现协议TCP长连接框架”文章能帮助大家解决问
2023-06-29

python如何使用socket实现TCP协议长连接框架

这篇文章主要介绍了python如何使用socket实现TCP协议长连接框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。分析多了协议就会发现,很多的应用,特别是游戏类和IM类
2023-06-29

python3网络编程之socket

http://www.cnblogs.com/Bigtre/p/7261387.html
2023-01-31

简单介绍TCP协议三次握手过程

  简单介绍TCP协议三次握手过程:对于网络工程师来说,TCP协议几乎是大家每天都会接触到的网络协议,要知道,绝大多数网络连接的建立都是基于 TCP 协议的,那么接下来,我们就要来简单介绍一下使用 TCP 协议建立连接所需要经过的三次握手过程。  何为TCP协议三次握手?  先来说说什么是TCP协议三次握手,所谓三次握
简单介绍TCP协议三次握手过程
2024-04-18

信息安全工程师TCP协议考试资料

  信息安全工程师TCP协议考试资料有哪些?为了方便考生及时有效的备考,编程学习网小编为大家精心整理了软考信息安全工程师TCP协议考试知识点,供大家参考和学习。如想获取更多计算机软件水平考试的模拟题及备考资料,请关注编程学习网网站的更新。  传输层协议TCP 协议特点:TCP 是面向连接的协议,提供可靠的、全双工的、面向字节流
信息安全工程师TCP协议考试资料
2024-04-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录