1.介绍
Sockets是什么:
- Socket式电脑网络中进程间数据流的端点。
- Socket操作系统的通信机制。
- 应用程序通过Socket进行网络数据的传输。
Socket分为UDP和TCP两种不同的通信方式。
为什么是Socket?
- Socket能够适应多种网络协议
- Socket是基础应用,了解Socket可以举一反三
- 服务器传输大量涉及网络协议,离不开Socket应用
TCP通信过程和Socket通信过程:
2.Socket通信入门
2.1 服务器端程序
import socket
#创建实例
sk = socket.socket()
#定义绑定ip和port
ip_port = ("127.0.0.1",8888)
#绑定监听
sk.bind(ip_port)
#最大连接数
sk.listen(5)
print("正在接受数据")
#接收数据
conn,address =sk.accept()
#返回给客户端一条消息
msg ="hello world"
#verson 3.7.0
#python3.x以上,网络数据的发送接收都是byte类型
#如果发送的数据是string类型的则需要进行编码
conn.send(msg.encode())
#主动关闭连接
conn.close()
2.2 socket客户端程序
import socket
#访问服务器端的ip和端口
ip_port = ("127.0.0.1", 8888)
#实例初始化
client = socket.socket()
#连接主机
client.connect(ip_port)
#接收主机信息
data = client.recv(1024)
#打印接收的数据
print(data.decode())
2.3 socket客户端连续消息发送
客户端:
import socket
client = socket.socket()
ip_port = ("127.0.0.1",8888)
client.connect(ip_port)
data = client.recv(1024)
print(data.decode())
while True:
#输入发送的消息
msg_input = input("请输入发送的消息:")
client.send(msg_input.encode())
if msg_input == "exit":
break
#接收消息
data = client.recv(1024)
print(data.decode())
服务器端:
import socket
sk = socket.socket()
ip_port = ("127.0.0.1",8888)
sk.bind(ip_port)
sk.listen(5)
while True:
print("正在等待接受数据..........")
conn,address = sk.accept()
msg = "连接成功"
conn.send(msg.encode())
# 不断接收客户端发来的消息
while True:
# 接收客户端信息
data = conn.recv(1024)
pirnt(data.decode())
if data == b"exit":
break
#处理客户端信息
conn.send(data)
#同时发送一个随机数
conn.send(str(random.randint(1,1000)))
conn.close()
2.4 实例化参数含义
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
family:地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域实际上是使用本地 socket 文件来通信)
type:套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。
SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
proto:协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
fileno:如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。这可能有助于使用socket.close()关闭一个独立的插座。
3.网络通讯实现
基于UDP的Socket实现:
import socket
#创建实例
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#定义绑定ip和port
ip_port = ("127.0.0.1",8888)
#绑定监听
sk.bind(ip_port)
#while True:
#接收数据
data = sk.recv(1024)
#打印
print(data.decode())