zoukankan      html  css  js  c++  java
  • Python学习笔记【第十三篇】:Python网络编程一Socket基础

     什么是⽹络

      网络能把双方或多方连在一起的工具,即把数据从一方传递到另一方进行数据传递。

      网络编程就是不同电脑上的软件能够进行数据传递。即进程间的通讯。

    什么是TCP/IP协议

      协议就是大家一起遵守的约定。

      计算机都遵守的⽹络通信协议叫做 TCP/IP协议

    OSI七层协议 

      互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

    什么是IP

      某个电脑在网络中的具体位置

      ⽤来在⽹络中标记⼀台电脑的⼀串数字,⽐如192.168.1.1;在本地 局域⽹上是惟⼀的。

    什么是端口

       在计算机中端口就是某个程序的具体位置

       端⼝是通过端⼝号来标记的,端⼝号只有整数,范围是从0到65535

    .什么是socket

       socket(简称 套接字 ) 是进程间通信的⼀种⽅式,它与其他进程间通信的⼀ 个主要不同是: 它能实现不同主机间的进程间通信,我们⽹络上各种各样的服务⼤多都是基 于 Socket 来完成通信的

     socket层

     

      Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

      所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

     Socket套接字工作流程

     

      服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

    tcp三次握⼿ -------建立连接

    tcp四次挥⼿接-------断开连接

     

    TCP十种状态

     

    TCP通信的完整通讯过程,如下图:

     

    基于socket服务端客户端代码

    服务端代码

     1 # -*- coding: utf-8 -*-
     2 
     3 # 声明字符编码
     4 # coding:utf-8
     5 import socket
     6 
     7 # 创建服务端套接字
     8 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     9 # 这个配置是防止客户端直接关闭,服务器再次启动报错。(原因是TCP的四次挥手未完成。)
    10 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    11 # 绑定IP及端口
    12 server.bind(('', 7777))
    13 # 设置监听最多10个客户端
    14 server.listen(10)
    15 
    16 
    17 def socket_server():
    18     while True:
    19         # 等待客户端的连接,返回客户端套接字和客户端信息
    20         client_socket, client_info = server.accept()
    21         while True:
    22             try:
    23                 # 等待接收客户端发来的消息
    24                 client_msg = client_socket.recv(1024)
    25                 print("%s:%s" % (client_info, client_msg.decode('utf-8')))
    26                 # 给客户端发消息
    27                 client_socket.send("服务器收到了".encode("utf-8"))
    28             except Exception as e:
    29                 print("%s 未正常断开", client_info)
    30                 print(e)
    31                 break
    32         # 关闭套接字
    33         client_socket.close()
    34     server.close()
    35 
    36 
    37 if __name__ == "__main__":
    38     socket_server()

    客户端代码

     1 # -*- coding: utf-8 -*-
     2 
     3 # 声明字符编码
     4 # coding:utf-8
     5 
     6 import socket
     7 
     8 # 创建客户端socket 套接字
     9 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    10 
    11 # 连接服务器
    12 client.connect(('172.16.6.5', 7777))
    13 
    14 
    15 def socket_client():
    16     while True:
    17         send_msg = input(">>")
    18         # 向服务器发送消息
    19         client.send(send_msg.encode("utf-8"))
    20         # 等待服务器回消息
    21         server_msg = client.recv(1024)
    22         print("<< %s" % server_msg.decode('utf-8'))
    23     # 关闭连接
    24     client.close()
    25 
    26 
    27 if __name__ == "__main__":
    28     socket_client()

    socket通讯基本方法总结

      服务端套接字函数
        s.bind() 绑定(主机,端口号)到套接字
        s.listen() 开始TCP监听
        s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

      客户端套接字函数
        s.connect() 主动初始化TCP服务器连接
        s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

      公共用途的套接字函数
        s.recv() 接收TCP数据
        s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
        s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
        s.recvfrom() 接收UDP数据
        s.sendto() 发送UDP数据
        s.getpeername() 连接到当前套接字的远端的地址
        s.getsockname() 当前套接字的地址
        s.getsockopt() 返回指定套接字的参数
        s.setsockopt() 设置指定套接字的参数
        s.close() 关闭套接字

      面向锁的套接字方法
        s.setblocking() 设置套接字的阻塞与非阻塞模式
        s.settimeout() 设置阻塞套接字操作的超时时间
        s.gettimeout() 得到阻塞套接字操作的超时时间

      面向文件的套接字的函数
        s.fileno() 套接字的文件描述符
        s.makefile() 创建一个与该套接字相关的文件

    什么是UDP?

      UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整 的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否 到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。

      UDP通信时不需要建⽴连接,数据的传输⾃然是不可靠 的,UDP⼀般⽤于多点通信和实时的数据业务,⽐如 语⾳⼴播 视频 QQ TFTP(简单⽂件传送) SNMP(简单⽹络管理协议) RIP(路由信息协议,如报告股票市场,航空信息)

      DNS(域名解释

      创建⼀个udp客户端程序的流程是简单,具体步骤如下:

    UDP服务端

     1 # -*- coding: utf-8 -*-
     2 
     3 # 声明字符编码
     4 # coding:utf-8
     5 
     6 import socket
     7 
     8 
     9 def udp_server():
    10     server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    11 
    12     server.bind(('', 8888))
    13     while True:
    14         server_msg, client_info = server.recvfrom()
    15 
    16         print('%s << %s' % (client_info, server_msg.decode('utf-8')))
    17         msg = input('>>')
    18         server.sendto(msg.encode('utf-8'), client_info)
    19 
    20 
    21 if __name__ == "__main__":
    22     udp_server()

    UDP客户端

     1 # -*- coding: utf-8 -*-
     2 
     3 # 声明字符编码
     4 # coding:utf-8
     5 
     6 import socket
     7 
     8 
     9 def udp_client():
    10     client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    11     while True:
    12         msg = input('>>')
    13         client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8888))
    14         server_msg, server_info = client.recvfrom()
    15         print('%s << %s' % (server_info, server_msg.decode('utf-8')))
    16 
    17 
    18 if __name__ == "__main__":
    19     udp_client()

    udp总结

      1. udp是TCP/IP协议族中的⼀种协议能够完成不 同机器上的程序间的数据通信

      2. udp服务器、客户端 udp的服务器和客户端的区分:

        往往是通过 请求服务 和 提供服务 来进⾏ 区分 请求服务的⼀⽅称为:客户端 提供服务的⼀⽅称为:服务器

      3. udp绑定问题

        ⼀般情况下,服务器端,需要绑定端⼝,⽬的是为了让其他的客户端能 够正确发送到此进程 客户端,⼀般不需要绑定,⽽是让操作系统随机分配,这样就不会因为 需要绑定的端⼝被占⽤⽽导致程序⽆法运⾏的情况

  • 相关阅读:
    [易学易懂系列|rustlang语言|零基础|快速入门|(18)|use关键词]
    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
    [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化]
    区块链行业访谈:《创世访谈录》
    波卡简介
    [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]
    GIT分布式代码管理系统
    jenkins介绍及部署tomcat环境、部署Maven项目及密码忘记修改
    Docker安装、命令详情、层级架构、docker服务启动失败解决方法
    ELK日志分析系统部署
  • 原文地址:https://www.cnblogs.com/wendj/p/9342838.html
Copyright © 2011-2022 走看看