Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信),最后拓展到可以使网络上两台计算机的不同程序进行数据信息传递
服务端接口代码流程以及参数介绍
# 服务端代码流程介绍
# 导入模块
import socket
# 1.创建 socket 对象 设置通信方式
# tcp方式通信,流式通信可靠,持续传输且互相确认,所谓三次握手四次挥手就是说的tcp,成功不成功可感知,不易丢包,但是占用资源多
tcp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# udp方式通信,包式通信可靠性不佳,直接将信息打包成整体一次性发送,成功不成功无法感知,易丢包,但是占用资源少
udp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
# type: 套接字类型可以根据是面向连接的还是非连接(tcp/udp)分为 SOCK_STREAM 或 SOCK_DGRAM。
# protocol: 一般不填默认为 0。
# 2.bind主机的ip和端口到套接字(服务端的话就是自己的ip和自己设定的通信进程程序所用的端口,客户端的话就是服务器端的ip和设定的端口)
# bind():这个函数由服务端Socket调用,会将之前创建Socker与指定的IP地址和端口进行绑定。如果之前使用了AF_INET初始化Socket,那么这里可以使用元组(host, port) 的形式表示地址。
#
# 3.s.listen() #开始TCP监听
# listen():这个函数用于在使用TCP的服务端开启监听模式。这个函数可以使用个参数来指定可以挂起的最大连接数量。这个参数的值最小为1,一般设置为5。
#
# 4.s.accept() #被动接受TCP客户的连接,(阻塞式)等待连接的到来
# accept():这个函数用于在使用TCP的服务端接收连接,一般是阻塞态。接受TCP连接并返回(conn,adresse), 其中,conn 是新的套接字对象,可以用来接收和发送数据; address是连接客户端的地址。
# 需要注意,当客户端不与服务端连接的话,程序会在此接口处阻塞不会往下走,除非有客户端连接到服务端
服务端代码样例
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名 # 设置端口
s.bind((host_ip, port)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c,addr = s.accept() # 建立客户端连接
print("来自后面所示主机的连接已建立", addr)
# 接收消息
client_msg=conn.recv(1024) # 收消息
print(client_msg.decode("utf-8"))
# 发送消息 网络传输的是二进制的对象
c.send('欢迎访问服务端'.encode("utf-8"))
# conn.sendall("Hello! A_dmin!!".encoding="utf-8")
c.close() # 关闭连接
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() #关闭套接字
客户端代码样例
import socket
# 创建tcp,stocket对象
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务端
phone.connect((host_ip, port))
# 给服务端发消息
phone.send('hello'.encode('utf-8'))
# 接受消息
back_msg=phone.recv(1024)
print(back_msg)
phone.close()
参考博客链接