标签:enc str 结束 多个 encode form 处理 family 主机
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议
由于socket已经为我们封装好了,只需要遵循socket的规定去编程,写出的程序自然就是遵循TCP/UDP标准的
套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的
套接字家族名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一个机器,可以通过访问同一个文件系统间接完成通讯
套接字家族名字:AF_INET
主要使用AF_INET,其他不做了解
服务器先初始化Socket,然后与端口进行绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。如果有一个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务端的连接就建立了。客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
import socket
socket.socket(socket_family,socket_type,protocal = 0)
# socket_family:分为 AF_UNIX 或 AF_INET
# socket_type:分为 SOCK_STREAM 或 SOCK_DGRAM
# protocal:基本不填,默认为0
# 获取TCP/IP套接字
tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 获取UDP/IP套接字
tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 1.服务端套接字函数
s.bind() # 绑定(主机,端口号)到套接字
s.listen() # 开始TCP监听
s.accept() # 被动接受TCP客户的连接,(阻塞式)等待连接的到来
# 2.客户端套接字函数
s.connect() # 主动初始化TCP服务器连接
s.connect_ex() # connec()函数扩展版本,出错时返回出错码,而不是抛出异常
# 3.公共端套接字函数
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() # 关闭套接字
TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
import socket
server_side = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_side.bind(("127.0.0.1",8080))
server_side.listen(5)
print("服务端启动完成,开始监听地址:{}:{}".format("127.0.0.1",8080))
while True:
conn,client_address = server_side.accept()
while True:
try:
data = conn.recv(1024)
if data == 0:
break
print("客户端发来信息:{}".format(data.decode("utf-8")))
conn.send(data.upper())
except Exception:
break
conn.close()
import socket
client_side = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_side.connect(("127.0.0.1",8080))
while True:
msg = input("输入要发送的信息:").strip()
if len(msg) == 0:
continue
client_side.send(msg.encode("utf-8"))
data = client_side.recv(1024)
print(data.decode("utf-8"))
client_side.close()
标签:enc str 结束 多个 encode form 处理 family 主机
原文地址:https://www.cnblogs.com/zhuyouai/p/12740299.html