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

python基础之Socket套接字详解

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

python基础之Socket套接字详解

前言

Python语言提供了Socket套接字来实现网络通信。

Python的应用程序通常通过Socket"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

服务器和客户端的源代码

服务器端


#coding=utf-8
#创建TCP服务器
import socket
import time
from time import ctime

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE=1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.bind((HOST, PORT))  
sock.listen(5)
addr=(HOST,PORT)
while True:
    print('waiting for connection...')
    sock,addr =sock.accept()
    print('...connected from:',addr)
    while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
sock.close()

客户端


#coding=utf-8
#创建TCP客户端

import socket

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE = 1024
ADDR=(HOST,PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) 

while True:
    data = input('> ')
    if not data:
        break
    sock.send(data.encode())
    data = sock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)

sock.close()

执行结果显示:

首先执行服务器端,结果如图1:

在这里插入图片描述

紧接着执行客户端,如图2

在这里插入图片描述

需要注意的是:服务器端和客户端需要在两个IDLE Shell中打开,否则客户机一启动,服务器程序就会中止执行,而客户端又连不上服务器,从而报错,如图3

在这里插入图片描述

我们在图2中输入一些需要传输的信息,然后回车,在服务端可以看到收到了相关信息,如图4(客户端发送信息),图5(服务器端接收信息)

在这里插入图片描述
在这里插入图片描述

源代码解析

我们从服务器端开始看起,先上一部分代码:


import socket
import time
from time import ctime

这三句是导入了三个模块,分别是socket 模块、time模块和ctime模块。

1)socket 模块当中提供了与socket 套接字相关的各项功能,后面用到了很多,这里先介绍一个,其他一会再介绍:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

功能:创建套接字,并把创建好的套接字赋给一个变量sock,下面程序中与套接字相关的操作都由sock来完成。

格式:socket.socket([family[, type[, proto]]])

参数:

family: 套接字家族,可以使 AF_UNIX 或者 AF_INET。AF_INET,是指面向网络的,因特网;AF_UNIX,基于文件的;在本例中,我们使用AF_INET,利用因特网来进行通信。

type: 套接字类型,可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM。

SOCK_STREAM:对应着TCP,提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

SOCK_DGRAM:对应着UDP,提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

本例中选TCP协议。

protocol: 一般不填默认为 0。

2)time模块,完成python中与时间相关的计算,例如time.sleep(5)延时5秒,time time() 返回当前时间的时间戳等等。
下面的ctime也是其中一个功能,函数把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式,可以便于我们观察。转换以后的格式如下:

print “time.ctime() : %s” % time.ctime()

结果:time.ctime() : Tue Feb 17 10:00:18 2013

在我们的例子中,图4的圈2所表示的就是转换后的时间。


HOST = '127.0.0.1'
PORT = 8080
BUFSIZE=1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.bind((HOST, PORT))  
sock.listen(5)
addr=(HOST,PORT)

看完头部之后,我们来看第二部分。

前三句定义了三个变量:HOST、PORT、BUFSIZE,这三个变量分别是服务器的IP地址,服务器的端口,接收的最大数据量。

第四句sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 定义了socket 套接字。

第五句sock.bind((HOST, PORT)),将IP地址和端口绑定给定义的套接字sock。

第六句sock.listen(5),开始 TCP 监听。中间的5表示在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以了。

第七句addr=(HOST,PORT),定义了一个变量addr,并且将地址以元组的形式赋值给addr。


while True:
    print('waiting for connection...')
    sock,addr =sock.accept()
    print('...connected from:',addr)
    while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
        sock.close()
sock.close()

这是服务器代码的最后一部分,也是通信的主体,首先进入一个while True:的永真循环,进入之后执行print(‘waiting for connection…'),这就是图1上蓝色字所表示的一部分。

第三行执行sock,addr =sock.accept(),sock.accept()是被动接受TCP客户端连接,(阻塞式)等待连接的到来,当客户机启动提交请求后,服务器接受请求,并将客户端的IP地址等信息存入变量addr中。

第四行执行print('…connected from:',addr),所以输入字符串…connected from:以及客户端传来的IP地址和端口。

以上服务器和客户端的通信就连接起来了。

下面开始传送数据,又进入一个永真循环,代码:


  while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
        sock.close()

第二行:data =sock.recv(BUFSIZE).decode()。

sock.recv()表示接收 TCP 数据,数据以字符串形式返回,BUFSIZE指定要接收的最大数据量。

decode() 将其他编码的字符串解码成unicode格式。

这里要说明一下,上图:

在这里插入图片描述

字符串在python内部是用unicode编码来表示,而在硬盘是utf-8格式。所以在存储和使用时要进行格式转换,转换的方式:

decode 将其他编码的字符串(例如utf-8)解码成unicode格式。

encode 将unicode编码成另一种编码格式(例如utf-8)。

当然decode和encode 不止可以转换utf-8类型,转换的类型可以通过 encoding 来指定,不过我们常用的就是这个。

总结一下,data =sock.recv(BUFSIZE).decode()执行结束就表示把客户端的数据接收过来存放到了data这个变量中。

下面进行第三行print(‘date=',data),打印数据,结果就是图5中的圈3所表示的。

第四行及第五行: 如果没有接收到数据,则跳出循环,继续监听。

if not data:
break

第六行 sock.send(('[%s] %s' %(ctime(),data)).encode()),向客户端发送转换格式(encode)后的数据。

数据包括两部分,第一部分是ctime(),表示以字符串形式表示的时间,data表示变量中存的信息.前面还有一部分'[%s] %s'中的%s格式化字符串,形成需要的输出格式。

最后一句sock.close(),关闭套接字。

这样服务器端就完成了。我们再来看客户端。


import socket

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE = 1024
ADDR=(HOST,PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) 

这部只解释几句,HOST = ‘127.0.0.1' ,PORT = 8080,这两句是服务器端的IP地址和端口号。

sock.connect((HOST, PORT)) 这一句是利用创建好的socket套接字主动初始化TCP服务器连接,就是向服务器提出申请,服务器端用sock.accept()接受请求。

这一句执行完之后,通信就建立起来了,在服务器端会执行print('…connected from:',addr),结果如图5圈2所示。


while True:
    data = input('> ')
    if not data:
        break
    sock.send(data.encode())
    data = sock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)
sock.close()

接下来进入永真循环,先是input函数,输出> 后等待输入,如图2所示。例如输入hi,server,如图4的圈1,然后后两句是

if not data:
break

如果没有输入,则跳出循环。

第五行sock.send(data.encode()),将输入的数据转换格式后将数据发送给服务器端,这时把hi,server发送给服务器端,服务器用data =sock.recv(BUFSIZE).decode()来接收,同时用print(‘date=',data)打印出来,结果如5的圈3所示。

这时,服务器会继续执行sock.send(('[%s] %s' %(ctime(),data)).encode()),把当前的时间和数据发送给客户端。

而在客户端,执行data = sock.recv(BUFSIZ).decode(),所以客户端会接收到相应的数据,并且打印出来,结果如图4的圈2所示。

以上就是Socket套接字的TCP通信。

到此这篇关于python基础之Socket套接字详解的文章就介绍到这了,更多相关python Socket详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

python基础之Socket套接字详解

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

下载Word文档

猜你喜欢

python基础之Socket套接字的示例分析

这篇文章给大家分享的是有关python基础之Socket套接字的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不
2023-06-14

Python基础教程之tcp socket编程详解及简单实例

Python tcp socket编程详解 初学脚本语言Python,测试可用的tcp通讯程序: 服务器:#!/usr/bin/env python # -*- coding: utf-8 -*- import socket impor
2022-06-04

Python基础之time库详解

一、前言 time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。 二、获取各种时钟 既然time库提供了多种类型的时钟。下面我们直接来获取这些时钟,对比其具体的用途。具体代码如下:import ti
2022-06-02

Python 基础之字符串string详解及实例

Python字符串(string) 详解 及 代码 Python的字符串可以使用单引号('), 双引号("), 三引号('''); 三引号(''')里面, 可以添加单引号和双引号, 也可以通过转义序列()添加; 字符串放在一起自动连接成为一
2022-06-04

Java基础学习之接口详解

接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法。本文通过一些示例详细为大家展示了接口的使用,需要的可以参考一下
2022-11-13

Python基础之hashlib模块详解

一、hashlib简介 1.什么叫hash: hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
2022-06-02

Python基础之Numpy的基本用法详解

一、数据生成 1.1 手写数组a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # 一维数组 b = np.array([[1, 2], [3, 4]]) #二维数组1.2 序列数组nump
2022-06-02

编程热搜

  • 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动态编译

目录