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设置tmpfs来加速项目的教程
Apr 17 Python
python通过索引遍历列表的方法
May 04 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
python可视化实现代码
Jan 15 Python
详解python配置虚拟环境
Apr 08 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
Python xmltodict模块安装及代码实例
Oct 05 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/06/20 PHP
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
jupyter notebook实现显示行号
2020/04/13 Python
用python读取xlsx文件
2020/12/17 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
烹调加工管理制度
2014/02/04 职场文书
实验教师岗位职责
2014/02/13 职场文书
迎新晚会主持词
2014/03/24 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
诚信承诺书
2015/01/19 职场文书
《叶问2》观后感
2015/06/15 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
导游词之千岛湖
2019/09/23 职场文书