一、什么是socket
socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议隐藏在socket接口的后面,对使用者而言,一组接口就是全部,让socket去组织数据。
二、分类
常用的三类TCP/IP协议的套接字:
- 流式套接字(SOCK_STREAM):
流式套接字用于提供面向链接、可靠的数据传输服务,使用TCP协议。 - 数据报套接字(SOCK_DGRAM):
数据报套接字提供了一种无连接的服务,该服务不能保证数据传输的可靠性,使用UDP协议。 - 原始套接字(SOCK_RAW):
原始套接字允许对较低层次的协议直接访问,如IP,常用与检验新的协议的实现,或者访问现有服务中配置的新设备。
三、套接字工作流程
四、基于TCP的套接字
TCP服务端:
# TCP服务端
# 循环链接
from socket import *
ip_port = ('127.0.0.1',8000)
back_log = 5
buffer_size = 1024
tcp_server = socket(AF_INET,SOCK_STREAM) #建立服务端
tcp_server.bind(ip_port) #绑定ip及端口
tcp_server.listen(back_log) #开启服务端
while True:
print("服务端开启了,等待连接")
conn,addr = tcp_server.accept() #等待连接
print("客户端地址:",addr)
while True:
try:
msg = conn.recv(buffer_size) #收信息
if not msg: break
print("来自客户端的信息>>>",msg.decode("utf-8"))
conn.send(msg.upper()) #发信息
except Exception:
print("该链接关闭\n")
break
conn.close() #关闭链接
tcp_server.close() #关闭服务端
TCP客户端:
## TCP 客户端
from socket import *
ip_port = ('127.0.0.1',8000)
buffer_size = 1024
tcp_client = socket(AF_INET,SOCK_STREAM) #建立客户端
tcp_client.connect(ip_port) #建立连接
while True:
msg = input(">>>")
if not msg: continue
if msg == 'quit': break
tcp_client.send(msg.encode('utf-8')) #发信息
data = tcp_client.recv(buffer_size) #收信息
print("来自服务端的信息>>>",data.decode("utf-8"))
tcp_client.close()
这是一个简单的TCP服务端与客户端,客户端发送一段字符串,服务端将其大写并返回给客户端。
客户端运行结果:
服务端运行结果:
五、基于UDP的套接字
UDP服务端:
#UDP服务端
from socket import *
ip_port = ("127.0.0.1",8080)
udp_server = socket(AF_INET,SOCK_DGRAM) #数据报
udp_server.bind(ip_port)
while True:
data,addr = udp_server.recvfrom(1024)
print(data.decode("utf-8"))
udp_server.sendto(data.upper(),addr)
udp_server.close()
UDP客户端:
#UDP客户端
from socket import *
ip_port = ('127.0.0.1',8080)
udp_client = socket(AF_INET,SOCK_DGRAM) #数据报
while True:
msg = input(">>>")
udp_client.sendto(msg.encode("utf-8"),ip_port)
data,addr = udp_client.recvfrom(1024)
print(data.decode("utf-8"))
由于UDP并不需要建立链接,因此服务端可以同时跟多个客户端通信。