前言:Socket编程是属于网络编程,那么需要先知道网络七层模型
网络七层模型分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
Socket是属于对传输层进行编程。
传输层:传输层向高层提供可靠的端到端的网络数据流服务。每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP/UDP)
TCP/UDP的区别:
TCP和UDP很相似,但区别在于:UDP不提供数据包分组、组装、排序,无法保证接收者能否正确接收数据
TCP是面向连接,进行三次握手建立连接和四次挥手断开连接,UDP是不面向连接
TCP是可靠的、UDP不可靠
应用场景:TCP用于大的数据传输,如http协议
UDP是用于小的数据传输,如DNS协议
Socket通信原理:
实现套接字,通过套接字允许程序接受并进行连接,为了建立通信,网络通信的每个端点拥有一个套接字对象极为重要
套接字类型:
TCP套接字:需要指定套接字类型 SOCK_STRAM
UDP套接字:需要指定套接字类型 SOCK_DGRAM
实例1:创建TCP的服务端和客户端代码
# 服务端 # encoding=utf-8 import sys import socket ip_port = (‘127.0.0.1‘, 9999) sk = socket.socket() # 创建句柄 sk.bind(ip_port) # 绑定端口 sk.listen(5) # 监听(最多连接数) # 注意如果这里没有客户端连接进来,那么会处于一个阻塞的状态 conn, addr = sk.accept() # conn是客户端对象, addr是客户端ip地址 print(conn) print(addr) client_data = conn.recv(1024) # 获取客户端的数据 print(client_data.decode(‘utf-8‘)) conn.send(‘服务端回复的内容‘.encode(‘utf-8‘)) # 向客户端发送数据 conn.close() # 关闭
# 客户端 #encoding=utf-8 import socket ip_port = (‘127.0.0.1‘, 9999) sk = socket.socket() # 创建句柄 sk.connect(ip_port) # 和服务器建立连接 sk.send(‘客户端发送的数据‘.encode(‘utf-8‘)) # 向服务器发送数据 server_reply = sk.recv(1024) # 获取服务器返回的数据 print(server_reply.decode(‘utf-8‘)) sk.close() # 和服务器关闭连接
# 执行结果:
服务端执行结果:
客户端执行结果:
实例2:创建UDP的服务端和客户端代码#服务端from socket import *
from time import ctime HOST = ‘‘ # 空就默认是本地IP PORT = 1200 ADDR = (HOST, PORT) udpServer = socket(AF_INET, SOCK_DGRAM) # # 创建一个服务器端UDP套接字 udpServer.bind(ADDR) # 绑定服务器套接字
#如果没有客户端连接进来,那么服务端会处于阻塞状态
data, addr = udpServer.recvfrom(1024) # 接收来自客户端的数据 print("得到客户端数据:",data.decode("utf-8")) udpServer.sendto(b‘%s %s[%s]‘ % ("服务器发送消息:".encode("utf-8"),ctime().encode("utf-8"),data),addr) # 向客户端发送数据 udpServer.close()
# 客户端 #encoding=utf-8 from socket import * HOST = ‘localhost‘ PORT = 1200 ADDR = (HOST, PORT) udpClient = socket(AF_INET, SOCK_DGRAM) # 创建客户端UDP套接字 data = input(‘>‘) udpClient.sendto(data.encode("utf-8"), ADDR) # 向服务器端发送数据 data, ADDR = udpClient.recvfrom(1024) # 接收来自服务器端的数据 print(data.decode("utf-8")) udpClient.close()
执行结果:
服务端:
客户端:
原文:https://www.cnblogs.com/su-sir/p/12685211.html