首页 > 编程语言 >Python基础之网络编程:3、socket模块

Python基础之网络编程:3、socket模块

时间:2022-11-16 19:44:56浏览次数:49  
标签:... socket Python 编程 client print 服务端 客户端

Python基础之socket模块

目录

一、socket模块简介

​ 在以往学习的编程中,我们所编写的代码都是只能在自己的电脑中使用,无法通过网络进行交互,如果我们需要编写基于网络进行交互的程序,就意味着我们需要通过代码来控制我们之前所学习的七层协议(繁琐、复杂、类似于自己编写操作系统)

​ socket类似于操作系统,封装了丑陋复杂的接口,提供简单、快捷的接口

  • socket也叫套接字
    • 基于文件类型的套接字家族(单机)
      • AF_UNIX
    • 基于网络类型的套接字家族(联网)
      • AF_INET

二、代码实现

1、服务端

# 导入socket模块
import socket

# 1、产生一个socket对象,并指定采用的通信版本和版本协议(TCP)
# 括号内不填写 默认采用TCP,family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议即TCP
server_ojb = socket.socket()
# 2、绑定一个固定的地址(服务端必备条件)元组内第二位是指定端口
server_ojb.bind(('192.168.1.188', 8989))
# 3、设立半连接池
server_ojb.listen(5)
# 4、等待客户端接入---此处内部涉及’三次握手‘
sock, address = server_ojb.accept()
# 5、接收到客户端、指定接收字节数
data = sock.recv(1024)
print(data.decode('utf8'))
# 6、接收到客户端信息,反馈信息---只能支持二进制,字符需要转码
sock.send('欢迎光临~~'.encode('utf8'))
# 7、关闭通道
sock.close()
# 8、关闭整个程序
server_ojb.close()

2、客户端

# 1、导入模块
import socket

# 2、指定客户端对象
client_obj = socket.socket()
# 3、通过服务端的地址进行链接
client_obj.connect(('192.168.1.188', 8989))
# 4、直接给客户端发送消息
client_obj.send('店小二!快把好酒好菜给爷端上来!...'.encode('utf8'))
# 5、接收服务端发送过来的消息,并指定文件大小
data = client_obj.recv(1024)
print(data.decode('utf8'))

# 6、断开与服务端的链接

三、代码优化

​ 通过以上代码,可以实现同局域网下用户交互功,但是任然存在很多问题,下面键沟通过优化实现以下功能

1、聊天内容自定义
	正对消息,采用input格式化输入
2、循环聊天
	将聊天部分使用循环封起来
3、用户输入信息不能为空
	当用户输入空消息时,另一端无法接收到空消息,这时两方将会陷入等待之		中,可以使用if判断决绝问题
4、服务端多次重启会报错问题
	方式一:更改端口号
	方式二:导入模块,主要针对于苹果电脑问题
5、当客户主动断开如何继续服务其他客户端
	可以采用异常捕获,当异常时重新回到循环处判定

1、服务端

# 1、导入模块
import socket

# 2、指定客户端对象
client_obj = socket.socket()
# 3、通过服务端的地址进行链接
while True:
    try:
        client_obj.connect(('192.168.1.188', 8898))
    except OSError:
        print('客户端已连接其他主机...请稍后在尝试连接')
        break
    except ConnectionRefusedError:
        print('对方未开机或其他错误...正在尝试重新连接...')
    else:
        print('已连接至指定服务端')
while True:
    # 4、直接给客户端发送消息
    client_send = input('请输入需要回复的消息>>>:').encode('utf8')
    if not client_send:
        print('不能发送空消息...请重新输入')
        continue
    try:
        client_obj.send(client_send)
    except OSError:
        print('由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。')
    except ConnectionResetError:
        print('消息发送失败...客户端已断开连接...')
        break
    else:
        print('消息已发送...请耐心等待对方回复...')
    # 5、接收服务端发送过来的消息,并指定文件大小
    try:
        data = client_obj.recv(1024)
        print('收到客户端消息>>>:', data.decode('utf8'))
    except OSError:
        print('由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。')
    except ConnectionResetError:
        continue

2、客户端

# 1、导入模块
import socket

# 2、指定客户端对象
client_obj = socket.socket()
# 3、通过服务端的地址进行链接
while True:
    try:
        client_obj.connect(('192.168.1.99', 11888))
    except OSError:
        print('客户端已连接其他主机...请稍后在尝试连接')
        break
    except ConnectionRefusedError:
        print('对方未开机或其他错误...正在尝试重新连接...')
    else:
        print('已连接至指定服务端')
while True:
    # 4、直接给客户端发送消息
    client_send = input('请输入需要回复的消息>>>:').encode('utf8')
    if not client_send:
        print('不能发送空消息...请重新输入')
        continue
    try:
        client_obj.send(client_send)
    except OSError:
        print('由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。')
    except ConnectionResetError:
        print('消息发送失败...客户端已断开连接...')
        break
    else:
        print('消息已发送...请耐心等待对方回复...')
    # 5、接收服务端发送过来的消息,并指定文件大小
    try:
        data = client_obj.recv(1024)
        print('收到客户端消息>>>:', data.decode('utf8'))
    except OSError:
        print('由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。')
    except ConnectionResetError:
        continue

四、半连接池的概念

server.listen(5) # 半连接池

当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下

比如上面我们半连接池设置成五个,在优化后的代码中,由于用while循环包裹了代码,当我们在运行代码的时候可以这样理解,第一个客户端就会直接跟服务端进行交互,除此之外还有五个客户端可以排队,但是发出去的信息服务端那边暂时不会处理,要等到第一个客户端处理结束断开连接才会根据先后顺序依次往后处理

在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可

标签:...,socket,Python,编程,client,print,服务端,客户端
From: https://www.cnblogs.com/kangssssh/p/16897273.html

相关文章

  • python使用Tensorflow检测GPU运行与使用Pytorch
    GPU运行状态检测在先前,博主完成了GPU环境的配置,那么今天博主来实验一下使用GPU来运行我们的项目使用cmd输入nvidia-smi查看GPU使用情况,下面是Linux里面的一个显示下面是......
  • socket模块
    socket模块描述给我们提供了一个模拟控制OSI七层协议的方法,快让我们可以基于网络编写一个进行数据交互的程序socket也叫套接字基于文件类型的套接字家族(单机) ......
  • python之路29 网络编程基础2之 两种架构 传输层常见协议 socket模块
    软件开发架构1.C/S架构(Client:客户端和Server:服务端)服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用......
  • 软件二 结对编程
    现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下:①楼层号为0~20,其中0号为地下一层②有楼层限制的电梯不在相应楼层停靠,如单双层......
  • python爬取公众号文章发布时间
    使用xpath取出来的是空,爬取到本地的html,时间的标签如下,内容也是是空的<emid="publish_time"class="rich_media_metarich_media_meta_text"></em>经过查找发现网页使用的......
  • tensorflow1.x——如何在python多线程中调用同一个session会话
    如何在python多线程中调用同一个session会话? 这个问题源于我在看的一个强化学习代码:​​https://gitee.com/devilmaycry812839668/scalable_agent​​ 在众多的机器学习的......
  • 网络编程之socket模块
    网络编程之socket模块在上一篇博文中,我们介绍了osi的七层协议,从物理层简单介绍到了传输层,说到了传输层。每一层都有相对要遵循的协议如图:其中,物理层就是二进制,应用层可......
  • SparkSQL 核心编程
    DataFrame创建DataFrame从Spark数据源进行创建➢查看Spark支持创建文件的数据源格式scala>spark.read.csvformatjdbcjsonloadoptionoptionsorcparqu......
  • OSI七层协议补充与socket套节字
    OSI七层协议补充与socket套节字一、传输层之TCP与UDP协议TCP与UDP协议都是用来规定通信方式的,数据传输过程中能够遵循的协议有很多其中TCP协议和UDP协议是较为常见的两......
  • python连接hive
    安装"""pipinstallpyhs2等待这个模块安装完成之后不要关闭命令行,接着在新的一行去执行命令。此时这个命令的作用是开启hive服务,否则python程序无法成功连接,命令如下:......