python网络编程socket实现服务端、客户端操作详解


Posted in Python onMarch 24, 2020

本文实例讲述了python网络编程socket实现服务端、客户端操作。分享给大家供大家参考,具体如下:

本文内容:

  • socket介绍
  • TCP:
    • 服务端
    • 客户端
  • UDP:
    • 服务端
    • 客户端

首发时间:2018-02-08 01:14

修改:

  1. 2018-03-20 :重置了布局,增加了UDP

什么是socket:

  • socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
  • 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
  • socket就像电话线插口,只有电话线插上了,才能通信。
  • python中使用socket来进行网络连接传输

    TCP:

    • 如果使用socket模块来创建TCP客户端和服务端:
      • 首发需要导入模块:import socket
      • 然后创建过程在下面

    服务端:

    TCP服务端一般需要下面几个操作:建立,绑定IP地址和端口,监听端口,等待连接,接收数据,传输数据 ,关闭连接

    • 建立:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  【参数默认就是socket.AF_INET, socket.SOCK_STREAM】
    • 绑定端口:server.bind(('IP地址',端口)),【地址和端口号是一个 tuple 】
    • 监听:server.listen()
    • 接受连接: conn,addr=server.accept(),返回值是一个连接实例和一个地址,地址是连接过来的客户端地址,而数据操作要利用这个连接实例
    • 传输数据:conn.send(data),【传输的数据必须是字节流,所以对字符串数据需要使用encode() 】
    • 接收数据read:conn.recv(size),【传输的数据必须是字节流,size是接收的字节数,如果需要转成Unicode,需要使用decode() 】
    • 关闭连接close:close()
    import socket
    server=socket.socket()#建立socket
    server.bind(('localhost',1234))#绑定
    server.listen()#监听
    print("开始等待。。。")
    conn,addr=server.accept()#接收连接
    print("连接成功")
    data=conn.recv(1024)#接收数据
    print(data.decode())
    conn.send(data)#发送数据
    server.close()#关闭连接
    print("--------------------")
    • 上述代码存在一个问题:只能接受一次连接,连接结束后,服务端socket将关闭,更改成不立即关闭能等待下一个连接的:
    #服务器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #绑定ip和端口
    server.listen(5) #监听
    while True:
      print("开始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客户端连接")
      while True:
        data = conn.recv(1024)
        print("recv:",data)
        if not data: #当data=0时为真
          print("连接断开...")
          break
        conn.send(data)
    server.close()

    注:上述代码中在linux中正常运行,在windows中会报错!

    如果要在windows中运行,需要捕获异常:

    #服务器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #绑定ip和端口
    server.listen(5) #监听
    while True:
      print("开始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客户端连接")
      while True:
        try:
          data = conn.recv(1024)
          print("recv:",data)
          if not data: #当data=0时为真
            print("连接断开...")
            break
          conn.send(data)
        except ConnectionResetError as e:
          print(e)
          break
    server.close()

    客户端:

    TCP客户端一般需要下面几个操作:建立socket,连接远程socket,传输数据 ,接收数据,关闭连接

    • 建立:client=socket.socket()
    • 连接:client.connect(('IP地址',端口)),其中地址和端口号是一个 tuple
    • 传输数据:client.send(data),传输的数据必须是字节流,所以对字符串数据需要使用encode()
    • 接收数据recv:client.recv(size),传输的数据是字节流,如果需要转成Unicode,需要使用decode()
    • 关闭连接close:close()
    import socket
    client=socket.socket()#建立socket
    client.connect(('localhost',1234))#连接
    client.send("你好".encode())#发送数据
    data=client.recv(1024)#接收数据
    print(data.decode())
    client.close()#关闭连接
    • 上述代码存在一个问题:只能发送一次数据,发生完数据就会断开连接,改成可以多次发送数据,不自动断开的【前提是服务端能接收多次】:
    import socket
    client=socket.socket()
    client.connect(('localhost',1234))
    while True:
      cmd=input(">>")
      if len(cmd)==0:
        continue
      client.send(cmd.encode())
      cmd_res=client.recv(1024)
      print(cmd_res.decode())
    client.close()

    UDP:

    服务端:

    UDP服务端通常有以下几个操作:创建socket,绑定端口,传输数据,接收数据

    • 创建socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    • 绑定端口:server.bind(addr),【addr是一个元组,内容为(地址,端口)】
    • 接收数据:data,client_addr=server.recvfrom(1024)
    • 传输数据:server.sendto(data,client_addr)
    import socket
    import time
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(("localhost",1234))
    start_time=time.time()
    while True:
      data,addr=server.recvfrom(1024)
      print(data,addr)
      server.sendto("hello".encode(),addr)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    server.close()

    客户端:

    UDP客户端通常有以下几个操作:创建socket,传输数据,接收数据

    • 创建socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    • 传输数据:server.sendto(data,addr),【addr是一个元组,内容为(地址,端口)】
    • 接收数据:data,server_addr=client.recvfrom(1024)
    import socket,time
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr=("localhost",1234)
    start_time=time.time()
    while True:
      client.sendto(time.ctime().encode(),addr)
      data,addr= client.recvfrom(1024)
      print(data)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    client.close()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python入门篇之字符串
Oct 17 Python
Python开发常用的一些开源Package分享
Feb 14 Python
Python中几种导入模块的方式总结
Apr 27 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python日志模块logbook使用方法
Sep 19 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python的这些库,你知道多少?
Jun 09 Python
python实现批量修改文件名
Mar 23 #Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 #Python
python实现遍历文件夹图片并重命名
Mar 23 #Python
Python3 mmap内存映射文件示例解析
Mar 23 #Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 #Python
python实现横向拼接图片
Mar 23 #Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 #Python
You might like
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
详解Django中的权限和组以及消息
2015/07/23 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
英国日常交易网站:Wowcher
2018/09/04 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
上海方立数码笔试题
2013/10/18 面试题
人事行政主管岗位职责
2013/12/22 职场文书
社团招新策划书
2014/02/04 职场文书
函授自我鉴定范文
2014/02/06 职场文书
倡议书作文
2015/01/19 职场文书
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python