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实现随机密码字典生成器示例
Apr 09 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
Jan 09 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
python实现KNN近邻算法
Dec 30 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脚本不报错的原因
2014/06/12 PHP
10个php函数实用却不常见
2015/10/13 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
js 获取radio按钮值的实例
2013/08/17 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
python实现按首字母分类查找功能
2019/10/31 Python
python实发邮件实例详解
2019/11/11 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python通过Pillow实现图片对比
2020/04/29 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
餐饮管理自我介绍信
2014/01/15 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
地方白酒代理协议书
2014/10/25 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
Python Django项目和应用的创建详解
2021/11/27 Python