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类的定义、继承及类对象使用方法简明教程
May 08 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
python如何在列表、字典中筛选数据
Mar 19 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
Python全栈之列表数据类型详解
Oct 01 Python
python字符串替换re.sub()实例解析
Feb 09 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
pytorch 查看cuda 版本方式
Jun 23 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
python析构函数用法及注意事项
Jun 22 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php单件模式结合命令链模式使用说明
2008/09/07 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
angularjs实现简单的购物车功能
2017/09/21 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
python七夕浪漫表白源码
2019/04/05 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
给校长的建议书400字
2014/05/15 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
人代会标语
2014/06/30 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
公司委托书范本5篇
2014/09/20 职场文书
五年级学生评语大全
2014/12/26 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书