为何学习socket一定要先学习互联网协议?
首先C/S架构是基于网络通信的
然后网络的核心即一堆网络协议,也就是协议标准。如果你想开发一款基于网络通信的软件,就必须遵循这些标准
socket层:socket处于应用层与传输层之间,提供了一些简单的接口. 避免与操作系统之间对接,省去了相当繁琐复杂的操作.socket在python中属于一个模块.为我们提供了这些简单的功能.
socket是什么?
socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
基于TCP协议的socket
套接字函数
服务端套接字函数:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 1.服务端套接字函数
phone.bind('主机ip地址',端口号) #绑定到(主机,端口号)套接字
phone.listen() #开始TCP监听
phone.accept() #被动接受TCP客户的连接,等待连接的到来
客户端套接字函数:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
phone.connect() #主动连接服务端的ip和端口
phone.connect_ex() #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常
服务端和客户端的公共用途的嵌套字函数:
phone.recv() #接受TCP数据
phone.send() #发送TCP数据
phone.recvfrom() #接受UDP数据
phone.sendto() #发送UDP数据
phone.getpeername() #接收到当前套接字远端的地址
phone.getsockname() #返回指定套接字的参数
phone.setsockopt() #设置指定套接字的参数
phone.close() #关闭套接字
server:
import socket
# 买电话
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket
# 绑定电话卡
phone.bind(('192.168.14.198',8848)) # 绑定IP地址和端口
# 开机监听
phone.listen(5)
print(111)
# 等待连接
conn, addr = phone.accept() # 阻塞
print(conn,addr)
from_client_data = conn.recv(1024) # 至多接受1024个字节 阻塞
print(f'来自客户端{addr[0]}的消息:{from_client_data.decode("utf-8")}')
to_client_data = input('>>>')
conn.send(to_client_data.encode('utf-8'))
conn.close()
phone.close()
client
import socket
# 买电话
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket
# 拨号打电话
phone.connect(('127.0.0.1',8848))
data = input('请输入>>>')
phone.send(data.encode('utf-8'))
from_server_data = phone.recv(1024)
print(f'来自服务端的消息:{from_server_data}')
# 关闭电话
phone.close()
原文:https://www.cnblogs.com/zhangdadayou/p/11431795.html