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 BeautifulSoup使用方法详解
Nov 21 Python
python实现文件分组复制到不同目录的例子
Jun 04 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
python发送HTTP请求的方法小结
Jul 08 Python
Python入门_学会创建并调用函数的方法
May 16 Python
python爬虫增加访问量的方法
Aug 22 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
Python如何将字符串转换为日期
Jul 31 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
python实现大文本文件分割成多个小文件
Apr 20 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项目开发中最常用的自定义函数整理
2010/12/02 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
javascript第一课
2007/02/27 Javascript
js 字符串操作函数
2009/07/25 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
小程序绑定用户方案优化小结
2019/05/15 Javascript
Python中itertools模块用法详解
2014/09/25 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
python3操作mysql数据库的方法
2017/06/23 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
Python实现区域填充的示例代码
2021/02/03 Python
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
自我评价正确写法范文
2013/12/10 职场文书
《掌声》教学反思
2014/02/23 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
保研推荐信
2014/05/09 职场文书
创建文明城市标语
2014/06/16 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js