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 文件读写操作实例详解
Mar 12 Python
python生成随机mac地址的方法
Mar 16 Python
python实现计算倒数的方法
Jul 11 Python
python如何通过实例方法名字调用方法
Mar 21 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
django 连接数据库 sqlite的例子
Aug 14 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
让你的Python代码实现类型提示功能
Nov 19 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
如何使用python写截屏小工具
Sep 29 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
有关php运算符的知识大全
2011/11/03 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
php排序算法实例分析
2016/10/17 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
中止javascript执行的方法
2014/02/14 Javascript
nodejs教程之入门
2014/11/21 NodeJs
javascript作用域问题实例分析
2015/07/13 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
微信小程序 上传头像的实例详解
2017/10/27 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
彻底理解js面向对象之继承
2018/02/04 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
python实现抖音点赞功能
2019/04/07 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
人事部主管岗位职责
2013/12/26 职场文书
模范家庭事迹材料
2014/02/10 职场文书
介绍信怎么写
2015/05/05 职场文书
小学英语教学反思范文
2016/02/15 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers