本文内容:

  • 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网络编程:socket、服务端、客户端的更多相关文章

    1. python 并发编程 socket 服务端 客户端 阻塞io行为

      阻塞io行为 server.accept server.recv client.send recv,accept  分为两个阶段 1.wait for data 对方把数据经过网络延迟送到自己的操作系 ...

    2. python网络编程TCP服务多客户端的服务端开发

      #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

    3. python网络编程socket /socketserver

      提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...

    4. Day07 - Python 网络编程 Socket

      1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

    5. Python网络编程socket

      网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

    6. Python 网络编程——socket

      一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...

    7. Python网络编程—socket(一)

      从今天开始python基础就介绍完毕了,下面我们将进阶到socket网络编程的介绍,那么socket是什么呢?我们带着这个问题开始今天的介绍: 一.socket初探 socket通常也称作" ...

    8. TCP Socket服务端客户端(二)

      本文服务端客户端封装代码转自https://blog.csdn.net/zhujunxxxxx/article/details/44258719,并作了简单的修改. 1)服务端 此类主要处理服务端相关 ...

    9. 在python中编写socket服务端模块(二):使用poll或epoll

      在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

    随机推荐

    1. I2C软件调试思路并知识总结

      I2C是一种只使用两根线的串行通信协议.一根线是串行数据线SDA,另外一种是串行时钟线SCL. I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v. I²C的参考设计使用一个7比特长 ...

    2. Linux - 变量的查看与设置

      printenv - print all or part of environment 显示所有变量:print 显示某个变量:print <variable name> 或者 echo ...

    3. NHibernate删除数据时遇到deleted object would be re-saved by cascade级联问题

      今天在处理数据时遇到了这个问题,数据是一对多的关系,A包含多个B,想将某个B从A中移除,在保存时抛出如标题的问题,查找了下资料得知:由于在配置文件中设置了cascade为all,A和B存在级联关系,那 ...

    4. mysql之select语法

      一:连接查询(外链接outer和内链接inner) 连接查询是另一种类型的多表查询.连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表 ...

    5. 使用Jexus服务器运行Asp.Net Core2.0程序

      前段时间写了篇关于.net core跨平台部署的文章.https://my.oschina.net/lichaoqiang/blog/1861977 主要讲述了,利用Nginx+CentOS+Supe ...

    6. Intellij-配置JDK版本和编译版本

      (1) (2) (3) (4)

    7. Javascript和JQuery函数定义方式

      Javascript 函数定义方式 1.function show() {     } 2.var cal = function() {     },必须先声明才能调用 示例: <html> ...

    8. Docz 用 MDX 写 React UI 组件文档

      Docz 用 MDX 写 React UI 组件文档 前言 为了提升开发效率,创建一套 UI 组件库是一种较为有效的方式之一:可以减少重复工作.提高可复用,所以现在越来越多团队开始创建自己的 UI 组 ...

    9. Hadoop项目开发笔录

      1.概要 我打算分享一下,我开发Hadoop的一些心得,对于即将步入Hadoop行业的童鞋,希望我整理的这些博文对您有帮助,我打算分为以下几部分来描述. 2.步骤 注:点击链接可直接跳到指定位置 Ha ...

    10. Docker导入、导出、删除容器

      1.导出某个容器导出某个容器,非常简单,使用docker export命令,语法:docker export $container_id > 容器快照名导出后在本地可以看到有一个centos.t ...