网络编程

116 阅读3分钟

什么叫网络编程

  • 使用Python语言编写代码实现网络计算机之间的数据交互

为什么需要通信协议

  • 协议即规则,好比汽车上路要遵守交通规则一样
  • 为了使全世界不同类型的计算机都可以连接起来,所以需要通信协议
  • 有了Internet协议,任何私有网络,只要支持这个协议,就可以接入互联网

Internet协议的主要协议及其层次关系

image.png

TCP/IP协议

TCP/IP协议

  • TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇
  • FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具有代表性,所以被称为TCP/IP协议
  • TCP协议是建立在IP协议之上。负责两台计算机之间建立可靠链接,保证数据包按顺序发送到

image.png

image.png

TCP协议的三次握手

image.png

UDP协议

UDP协议

  • 用户数据包协议(User Datagram Protocol)
  • UDP协议是面向无连接的协议
  • 知道对方的IP地址和端口,就可以直接发送数据包
  • 由于是面向无连接,所以无法保证数据一定会到达

端口

  • 用于区分不同的应用程序,80端口分给了HTTP服务,21端口分给了FTP服务

TCP和UDP的区别

连接方面的区别

  • TCP面向连接的;UDP面向无连接

安全方面的区别

  • TCP传输消息可靠,不丢失,按顺序到达;UDP无法保证不丢包

传输效率的区别

  • TCP传输效率相对较低;UDP传输效率高

连接对象数量的区别

  • TCP连接只能是点到点,一对一的;UDP支持一对一,一对多,多对多的交互通信

Socket简介

Socket

  • 套接字,用于描述IP地址和端口号

image.png

Socket的常用方法

image.png

TCP编程

TCP服务器端流程

  • 使用socket() 函数创建一个套接字
  • 使用bind((ip, port)) 函数绑定IP地址和port
  • 使用listen() 函数开始TCP监听
  • 使用accept() 函数等待客户端的连接
  • 使用recv()/send() 函数接收发送的数据
  • 使用close() 关闭套接字

TCP客户端与服务器端通信模型

image.png

编写服务器端

import socket  # 导入

ip = '127.0.0.1'
port = 8888
print('--------服务器端已启动--------')
# 1.创建socket对象  socket.AF_INET用于Internet之间进程通信,socket.SOCK_STREAM用于TCP协议
socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定主机和端口
socket_obj.bind((ip, 8888))

# 3.设置最大的连接数量
socket_obj.listen(5)
# 4.被动等待客户端TCP连接
client_socket_obj, addr = socket_obj.accept()
print('--------成功建立连接--------')
# 5.接收客户端发送过来的数据
info = client_socket_obj.recv(1024).decode('utf-8')
while info != 'bye':
    if info != '':
        print('接收到的数据是:', info)
    # 准备发送信息
    data = input('请输入要发送的内容:')
    client_socket_obj.send(data.encode('utf-8'))
    if data == 'bye':
        break
    info = client_socket_obj.recv(1024).decode('utf-8')

# 关闭socket
client_socket_obj.close()
socket_obj.close()

编写客户端

import socket

# 创建socket对象
client_socket = socket.socket()
# 主机服务器的IP地址
ip = '127.0.0.1'
# 主机服务器程序的端口
port = 8888
# 连接服务器
client_socket.connect((ip, port))
print('--------已建立服务器连接--------')
info = ''
while info != 'bye':
    send_data = input('请客户端输入要发送的数据:')
    client_socket.send(send_data.encode('utf-8'))
    if send_data == 'bye':
        break
    info = client_socket.recv(1024).decode('utf-8')
    print('收到服务器的响应数据是:', info)

client_socket.close()