美文网首页
Python Socket编程(高级编程五)

Python Socket编程(高级编程五)

作者: 冷煖自知 | 来源:发表于2020-01-07 12:58 被阅读0次

socket简介

socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯

TCP/IP协议
TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

  • 网络七层协议
    应用层
    表示层
    会话层
    传输层
    网络层
    数据链路层
    物理层
socket的使用

1.创建套接字
2.使用套接字收/发数据
3.关闭套接字


UDP

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) #创建socket对象

import socket
# family   
# 协议族 AF_INET ipv4   AF_INET6  ipv6    AF_UNIX unix本机之间进行通信
# type
# SOCK_STREAM TCP套接字类型    
# SOCK_DGRAM UDP套接字类型
# SOCK_RAW 原始套接字类型,这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧
# SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
“”“
协议号通常为零,可以省略,或者在地址族为`AF_CAN`的情况下,协议应为`CAN_RAW`或`CAN_BCM`如果指定fileno,则忽略其他参数,从而导致具有指定文件描述器的套接字返回。与`socket.fromfd()`不同,fileno将返回相同的套接字,而不是重复。这可能有助于使用`socket.close()`关闭分离的套接字,**一般情况下后两个参数忽略即可**。
”“”

# udp 发送数据
udp_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
udp_socket.bind(("",8080)) # 绑定端口(发送数据时可不绑定,系统随机)
udp_socket.sendto(b"hello world", ('127.0.0.1', 8081)) # 发送数据(字节流)
udp_socket.close()

# udp 接收数据
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
bind_addr = ('', 8081)  # 不写ip 表示本机的任何一个ip
udp_socket.bind(bind_addr)
# 1024 表示本次接收的最大字节数
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0]decode('gbk')))
udp_socket.close()

TCP

TCP介绍
  • TCP协议,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议
  • TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
  • TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发生数据。
TCP特点
  • 面向连接
    • 通信双方必须先建立连接才能进行数据的传输
  • 可靠传输
    • TCP采用发送应答机制
    • 超时重传
    • 错误校验
    • 流量控制和阻塞管理
TCP与UDP区别总结
  1. TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  5. TCP对系统资源要求较多,UDP对系统资源要求较少。
TCP 客户端
import socket

'''
1.创建socket
2.链接服务器
3.接收数据(最大接收1024个字节)
4.关闭套接字
'''

tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接服务器
tcp_client.connect_ex(('127.0.0.1', 8080)) # 错误返回值

# 发送数据
send_data = input("发送的数据:")
tcp_client.send(send_data.encode())

# 接收数据  阻塞
recvdata = tcp_client.recv(1024)
print(recvdata.decode('gbk'))

tcp_client.close()
TCP 服务端
'''
TCP服务端

1 socket创建套接字
2 bind绑定IP和port     固定的
3 listen使套接字变为可以被动链接
4 accept等待客户端的链接
5 recv/send接收发送数据
'''
# tcp的套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定信息
tcp_server.bind(("192.168.0.161", 7890))

# 主动变被动
tcp_server.listen(128)

# 获取新socket对象
new_client_socket, client_addr = tcp_server.accept()

# 接收数据
recv_data = new_client_socket.recv(1024)
print(recv_data)

 # 发送数据
new_client_socket.send('haha'.encode('gbk'))

new_client_socket.close()
tcp_server.close()

多客户端需要两层循环

    # tcp的套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定信息
    tcp_server.bind(("192.168.0.161", 7890))
    # 为多个客户端服务
    while True:
        # 主动变被动
        tcp_server.listen(128)
        # accept() -> (socket object, address info)
        new_client_socket, client_addr = tcp_server.accept()
        # print(client_addr)

        # 为客户端多次服务
        while True:
            # 接收数据  阻塞
            recv_data = new_client_socket.recv(1024)
            # print(recv_data)
            # 客户端发送过来数据
            # 客户端断开连接

            if recv_data.decode('gbk'):
                # 发送数据
                new_client_socket.send('haha'.encode('gbk'))
            else:
                break
        # 关闭客户端
        new_client_socket.close()
    tcp_server.close()

相关文章

网友评论

      本文标题:Python Socket编程(高级编程五)

      本文链接:https://www.haomeiwen.com/subject/izsractx.html