返回顶部
首页 > 资讯 > 后端开发 > Python >【Python之旅】第五篇(二):Pyt
  • 404
分享到

【Python之旅】第五篇(二):Pyt

之旅第五篇Python 2023-01-31 03:01:17 404人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

    前面第五篇(一)中的一个Socket例子其实就是单线程的,即Server端一次只能接受来自一个Client端的连接,为了更好的说明socket单线程和阻塞模式,下面对前面的例子做修改。1.单线程+阻塞+交互式    前面的例子是单线

    前面第五篇(一)中的一个Socket例子其实就是单线程的,即Server端一次只能接受来自一个Client端的连接,为了更好的说明socket单线程和阻塞模式,下面对前面的例子做修改。


1.单线程+阻塞+交互式

    前面的例子是单线程阻塞和非交互式的,现在改写为交互式的,即不会执行一次就结束,希望达到的效果是,发送的数据由User输入,然后Server端进行接收。

Server端:与上个例子一样,并没有什么变化

import socket                #导入socket类
 
HOST =''                     #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有,也可以写成0.0.0.0
PORT = 50007                 #Server端开放的服务端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #选择Socket类型和Socket数据包类型
s.bind((HOST, PORT))         #绑定IP地址和端口
s.listen(1)                  #定义侦听数开始侦听(实际上并没有效果)
conn, addr = s.accept()      #定义实例,accept()函数的返回值可以看上面的socket函数说明
 
print 'Connected by', addr
while 1:
    data = conn.recv(1024)    #接受套接字的数据
    if not data:break         #如果没有数据接收,则断开连接
    print 'revc:',data        #发送接收到的数据
    conn.sendall(data)        #发送接收到的数据
conn.close()                      #关闭套接字

Client端:

import socket

HOST = '192.168.1.13'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
	user_input = raw_input('msg to send:').strip()    #由User输入要发送的数据
	s.sendall(user_input)
	data = s.recv(1024)
	print 'Received', repr(data)

s.close()

演示:

步骤1:Server端运行服务端程序

xpleaf@xpleaf-Machine:/mnt/hgfs/python/day5$ Python server4.py 
===>光标在此处处于等待状态

步骤2:Client A端运行客户端程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:The first msg.    ===>User输入数据
Received 'The first msg.'     ===>Server端返回的数据
msg to send:The second msg.
Received 'The second msg.'
msg to send:The third msg.
Received 'The third msg.'
msg to send:I'm A.
Received "I'm A."
msg to send:                  ===>继续等待User输入数据

步骤3:在Server端中观察现象

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5/[2]sec_4_ver2(单线程,交互式,阻塞模
一般演示)$ python server4.py 
Connected by ('192.168.1.13', 52645)
revc: The first msg.    ===>接收到用户发送的数据
revc: The second msg.
revc: The third msg.
revc: I'm A.
===>光标在此处处于等待状态

如果此时有另一个Client B端再连接进来,会有下面的情况:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:I'm B
===>光标在此处处于等待状态

    这时如果在Client A端断开连接,则服务端也会关闭套接字,Client B端发送的数据仍然无法被Server端接收。

    此时服务端即出现阻塞情况,因为服务端还和Client A处于连接状态,无法接收Client B发送的数据,这也说明了此时的Server端是单线程的。


2.单线程+阻塞+交互式的进阶演示

    把上面的例子中的代码再做进一步的修改,以使得阻塞模式的现象更加明显。

Server端:

import socket

HOST =''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while 1:
	conn, addr = s.accept()        #在循环中接受Client端连接的请求
	print 'Connected by', addr
	while True:                    #再做一个内部的循环
		data = conn.recv(1024)
		print 'Received',data
		if not data:break
		conn.sendall(data)
conn.close()

Client端:与前面例子的代码一样

import socket

HOST = '192.168.1.13'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
	user_input = raw_input('msg to send:').strip()
	s.sendall(user_input)
	data = s.recv(1024)
	print 'Received', repr(data)

s.close()

演示:

步骤1:Server端运行服务端程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
===>光标在此处处于等待状态

步骤2:Client A端运行客户端程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:Hello!
Received 'Hello!'
msg to send:I'm Client A.
Received "I'm Client A."
msg to send:        ===>继续等待User输入数据

步骤3:在Server端中观察现象

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
Connected by ('192.168.1.13', 52647)
Received Hello!
Received I'm Client A.
===>光标在此处处于等待状态

如果此时有另一个Client B端再连接进来,会有下面的情况:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:I'm Client B.
===>光标在此处处于等待状态

Server端的状态依然为:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
Connected by ('192.168.1.13', 52647)
Received Hello!
Received I'm Client A.
===>光标在此处处于等待状态

这时试图把Client A端断开:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:Hello!
Received 'Hello!'
msg to send:I'm Client A.
Received "I'm Client A."
msg to send:^CTraceback (most recent call last):
  File "client4.py", line 10, in <module>
    user_input = raw_input('msg to send:').strip()
KeyboardInterrupt

再看看Server端的情况:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
Connected by ('192.168.1.13', 52647)
Received Hello!
Received I'm Client A.
Received 
Connected by ('192.168.1.13', 52648)
Received I'm Client B.    ===>成功接收到来自Client B端发送的数据
===>光标在此处处于等待状态

再看看Client B端的情况:

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:I'm Client B.
Received "I'm Client B."
msg to send:    ===>光标在此处处于等待状态

    以上的现象,再根据Server端的程序代码,就可以非常好理解单线程模式和阻塞的细节情况了,在这里是这样的:Server端接受Client A端的连接后,即把接受连接的线程释放,但此时仍然占用接收和发送数据的线程,所以Client B端虽然可以连接上Server端,但数据是无法成功被Server端接收的;当Client A端断开与Server端的连接后,Server端的接收和发送数据的线程立即被释放,之后就可以正常接收来自Client B端发送的数据了。

    


    单线程,即数据的串行发送,会导致阻塞,上面的两个例子就非常好地演示了这个阻塞的过程,如果要解决这个问题,当然在Server端就需要支持多线程,即数据折并发

--结束END--

本文标题: 【Python之旅】第五篇(二):Pyt

本文链接: https://lsjlt.com/news/187734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Python之旅】第五篇(二):Pyt
        前面第五篇(一)中的一个Socket例子其实就是单线程的,即Server端一次只能接受来自一个Client端的连接,为了更好的说明socket单线程和阻塞模式,下面对前面的例子做修改。1.单线程+阻塞+交互式    前面的例子是单线...
    99+
    2023-01-31
    之旅 第五篇 Python
  • 【Python之旅】第五篇(三):Pyt
        前面的几个例子都是单线程的,下面再来说说多线程的。1.多线程模块    主要是socketserver模块,如下图示:2.多线程原理    如下图示说明:3.SockteServer例子说明服务器端:客户端:4.演示    还是以前...
    99+
    2023-01-31
    之旅 第五篇 Python
  • 【Python之旅】第五篇(一):Pyt
        只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理。1.Socket    socket也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“...
    99+
    2023-01-31
    之旅 第五篇 Python
  • 【Python之旅】第四篇(二):Pyt
        在Python程序的执行过程中,难免会出现异常的情况,如果做的是跟用户交互的程序,当用户输入不可接受的内容时,在可预见的范围内,我们当然是希望可以给用户一些提示,而不是原来Python内置异常中的那些提示语句,毕竟那些语句只适合给程...
    99+
    2023-01-31
    之旅 第四篇 Python
  • 【Python之旅】第二篇(一):Pyt
    说明:    主要是file()和open()函数的使用,但在查open()函数的帮助时,会有下面的说明:>>> help(open) …… Open a file using the file() type, retur...
    99+
    2023-01-31
    之旅 第二篇 Python
  • 【Python之旅】第三篇(三):Pyt
    说明:    Python的正则表达式功能强大,使用灵活,但由于目前对Python中正则表达式的使用和认识都比较浅,因此急于做笔记和总结显然是不可行的,因此,这里给出下面几篇不错的参考文档:1.较为详细的Python正则表达式功能介绍的文档...
    99+
    2023-01-31
    之旅 第三篇 Python
  • 【Python之旅】第四篇(一):Pyt
        有时候拿到一个程序接口,需要对其进行扩展,但是又不能修改原来接口的源代码,这时候就需要使用装饰器了。    有下面一个小程序,假如是别人提供给我们的调用接口:import time def sayHi():         tim...
    99+
    2023-01-31
    之旅 第四篇 Python
  • 【Python之旅】第六篇(三):Pyt
        学习Python的多线程(Multi-threading),至少应该要有进程与线程的基本概念,可以看我转载的一篇文章:《进程与线程的一个简单解释》。    在前面使用Python Socket来编写简版SSH程序的时候,其实已经有使...
    99+
    2023-01-31
    之旅 第六篇 Python
  • 【Python之旅】第六篇(四):Pyt
        在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一说。1.给线程加锁的原因    我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这...
    99+
    2023-01-31
    之旅 第六篇 Python
  • 【Python之旅】第六篇(六):Pyt
        关于进程与线程的对比,下面的解释非常好的说明了这两者的区别:    这里主要说明关于Python多进程的下面几点:1.多进程的使用方法 2.进程间的通信之multiprocessing.Manager()使用 3.Python进程池...
    99+
    2023-01-31
    之旅 第六篇 Python
  • 【Python之旅】第四篇(三):Pyt
        终于是来到了Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。1.面向对象编程的相关名词及解释    世界万物,皆可分类,一切皆为对象。    所谓的面向对象编程,指...
    99+
    2023-01-31
    之旅 第四篇 Python
  • 【Python之旅】第五篇(四):基于P
        还是继续延续篇五中前三节的例子,通过对代码的修修补补,把它改成一个可以在连接后就能在Client端执行Server端命令的程序,所以就有点类似于SSH连接程序了。    至于还是用前面的例子来改嘛,是因为上课也一直这么干,而且老师也...
    99+
    2023-01-31
    之旅 第五篇 Python
  • Python之路【第五篇】:Python
    一、文件操作 1、介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分。 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的...
    99+
    2023-01-31
    之路 第五篇 Python
  • Python学习之旅(二十五)
    正则表达式:检查一个字符串是否与某个模式匹配 \d :匹配数字 \w :匹配字母或数字 . :匹配任意字符 {n} :匹配n个字符 {m,n} :匹配m到n个字符 \s :匹配空格 a|b :匹配a或b ^ :匹配字符串开头 $ :匹配...
    99+
    2023-01-30
    之旅 二十五 Python
  • 【Python之旅】第七篇(一):再谈P
        主要是再进一步加深Python中关于多线程相关函数join()的理解以解多线程的执行过程。这里通过下面的例子来作进一步的说明。1.多线程与主程序代码的执行顺序关系    给出下面程序代码:#!/usr/bin/env python ...
    99+
    2023-01-31
    之旅 再谈 第七篇
  • python学习 第五篇 flask
    #!/usr/bin/env python #coding:utf-8 from flask import Flask,request,render_template,redirect #request 里面包含一次网络请求所有的内容,所有...
    99+
    2023-01-31
    第五篇 python flask
  • robotFramework第二篇之关键
    lesson.robot 1 *** Keywords *** 2 打开谷歌浏览器并访问百度首页 3 Log 打开浏览器,输入http://www.baidu.com,进入百度首页 4 5 输入用户名 6 ...
    99+
    2023-01-30
    第二篇 关键 robotFramework
  • python学习之旅(十五)
    一、装饰器 decorator:本质上就是函数,可以增强函数的功能。 定义起来虽然有点复杂,但使用起来非常灵活和方便 1、不修改被装饰函数的源代码 2、不修改被装饰函数的调用方式 3、装饰函数对被装饰函数透明 import funct...
    99+
    2023-01-30
    之旅 python 十五
  • python学习之旅(二)
    Python基础知识(1) 一、变量 变量名可以由字母、数字、下划线任意组合而成。 注意:1.变量名不能以数字开头;            2.变量名不能为关键字;            3.变量名尽量起有意义的,能够通过变量名知道代表的...
    99+
    2023-01-30
    之旅 python
  • python 学习笔记第二章:安装pyt
       记得上次写python的学习笔记是三个月以前了,期间看过,也放下过,这次要坚持下来,一鼓作气,吃下python。    本文内容主要是根据《Python 简明教程》和自己的一些理解去写的,有问题,还请指出。   一、Linux 下安装...
    99+
    2023-01-31
    第二章 学习笔记 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作