本文内容:

  • 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. LeetCode:21_Merge Two Sorted Lists | 合并两个排序列表 | Easy

      题目:Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list sh ...

    2. python 变量进阶(理解)

      变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引 ...

    3. mongodb3.x主从配置及备份

      本文将介绍下mongodb主从配置及备份 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...

    4. ubuntu18.04 运行时提示缺少libstdc++.so.6

      解决方法:输入命令 sudo apt- 提示:ubuntu默认软件包管理器不是yum,而是dpkg,安装软件时用apt-get PS:在ubuntu下最好不要去装yum,不然可能会出现一些奇怪的问题

    5. odoo开发笔记 -- 时区问题

      odoo 时区问题 待补充 odoo默认数据库是以UTC时间存放的:这也是odoo设计优秀的地方.

    6. Django | 模型类变更后生成迁移文件,报错:You are trying to add a non-nullable field 'BookName' to BookInfo without a default....

      报错: You are trying to add a non-nullable field 'BookName' to BookInfo without a default; we can't do ...

    7. 通过证书请求Https站点

      前几天在做与平安银行对接接口,主要是给平安银行推送用户数据(申请贷款的用户),平安银行提供的是https的地址,请求https地址的时候还要发送证书,刚接到这个任务的时候一头雾水,百度上各种所搜,最后 ...

    8. AOP技术基础(转)

      1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...

    9. 精读JavaScript模式(六),Memoization模式与函数柯里化的应用

      假期就这么结束了!十天假就有三天在路上,真的难受!想想假期除了看了两场电影貌似也没做什么深刻印象的事情.流浪地球,特效还是很赞,不过对于感情的描写还是逃不掉拖沓和尴尬的通病,对于国产科幻还是抱有支持的 ...

    10. Spring之IOC容器

      在前面博客中介绍什么是依赖注入时有提到:依赖注入是组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中.那什么是容器?既然Spring框架实现了IOC,那Spring中的容器 ...